🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.java
6 messages
6 total messages Started by Smok Sat, 27 Oct 2012 16:41
Zmienna z klasy potomnej w klasie bazowej
#153621
Author: Smok
Date: Sat, 27 Oct 2012 16:41
5 lines
1271 bytes
Cześć.
Czy w abstrakcyjnej klasie bazowej można użyć metody która wykorzystuje zmienną z klasy potomnej? Jak to zrobić?
Mam klasę "Działanie" w której chcę napisać metodę która wyrzuci na standardowe wyjście wartość zmiennej char ustawionej już klasie pochodnej (np dodawanie wyrzuci znak + a mnożenie wyrzuci znak *). 
Dzięki
Smok.
Re: Zmienna z klasy potomnej w klasie bazowej
#153622
Author: npe
Date: Sat, 27 Oct 2012 21:20
45 lines
1477 bytes
Masz dwie opcje:

1. Brzydsza* - w klasie bazowej zrobić sobie pole o widoczności protected:

class Base {
   protected char c;

   public void doSth() {
      System.out.println(c);
   }
}

class Sub extends Base {
   public Sub() {
     this.c = '@';
   }
}

2. Ładniejsza* - w klasie bazowej zrobić sobie abstrakcyjny getter:

class Base {
   protected abstract char getC();

   public void doSth() {

      char c = getC();

      System.out.println(c);
   }
}

class Sub extends Base {
   public Sub() {
   }

   @Override
   protected char getC() {
     return '@';
   }
}

* To moja osobista opinia, można mieć inne zdanie
-- 
npe
Re: Zmienna z klasy potomnej w klasie bazowej
#153623
Author: Krzysztof Rudnik
Date: Sun, 28 Oct 2012 00:12
12 lines
1218 bytes
Smok wrote:

> Cześć.
> Czy w abstrakcyjnej klasie bazowej można użyć metody która wykorzystuje
> zmienną z klasy potomnej? Jak to zrobić? Mam klasę "Działanie" w której
> chcę napisać metodę która wyrzuci na standardowe wyjście wartość zmiennej
> char ustawionej już klasie pochodnej (np dodawanie wyrzuci znak + a
> mnożenie wyrzuci znak *). Dzięki Smok.

Zrób metodę pure virtual.

Krzysiek
Re: Zmienna z klasy potomnej w klasie bazowej
#153625
Author: Arivald
Date: Sun, 28 Oct 2012 07:48
52 lines
2517 bytes
W dniu 2012-10-27 18:41, Smok pisze:
> Cześć.
> Czy w abstrakcyjnej klasie bazowej można użyć metody która wykorzystuje zmienną z klasy potomnej? Jak to zrobić?
> Mam klasę "Działanie" w której chcę napisać metodę która wyrzuci na standardowe wyjście wartość zmiennej char ustawionej już klasie pochodnej (np dodawanie wyrzuci znak + a mnożenie wyrzuci znak *).
> Dzięki
> Smok.
>

Dziwne pytanie. Skoro wiesz co to "klasa abstrakcyjna", to wydawało by 
się że wiesz jak działają funkcje wirtualne.


Co do pytania, w klasie bazowej deklarujesz tą metodę z modyfikatorem 
"virtual", opcjonalnie "abstract" jeśli nie chcesz dostarczać ciała 
metody w klasie bazowej.

type Dzialanie= class
public
   procedure PrintOperator(); virtual; abstract;

W klasie potomnej redeklarujesz metodę z modyfikatorem "override".

type Mnozenie = class(Dzialanie)
public
   procedure PrintOperator(); override;


procedure Mnozenie.PrintOperator();
begin
   Print('*');
end;

i teraz dla kodu:

   var zmienna: Dzialanie.

   zmienna = Mnozenie.Create();

Przy wywołaniu
   zmienna.PrintOperator();

Zostanie wykonana wersja metody z Mnozenie. A skoro tak, to może ona 
używać wszystkich zmiennych z Mnozenie.


BTW do tak prostego zadanie nie musisz nawet mieć zmiennej. Operator 
może być hardkodowany w implementacji funkcji. To dość typowe 
zastosowanie funkcji wirtualnych.


-- 
Arivald
Re: Zmienna z klasy potomnej w klasie bazowej
#153626
Author: Arivald
Date: Sun, 28 Oct 2012 07:59
83 lines
3295 bytes
W dniu 2012-10-28 08:48, Arivald pisze:
> W dniu 2012-10-27 18:41, Smok pisze:
>> Cześć.
>> Czy w abstrakcyjnej klasie bazowej można użyć metody która
>> wykorzystuje zmienną z klasy potomnej? Jak to zrobić?
>> Mam klasę "Działanie" w której chcę napisać metodę która wyrzuci na
>> standardowe wyjście wartość zmiennej char ustawionej już klasie
>> pochodnej (np dodawanie wyrzuci znak + a mnożenie wyrzuci znak *).
>> Dzięki
>> Smok.
>>
>
> Dziwne pytanie. Skoro wiesz co to "klasa abstrakcyjna", to wydawało by
> się że wiesz jak działają funkcje wirtualne.
>
>
> Co do pytania, w klasie bazowej deklarujesz tą metodę z modyfikatorem
> "virtual", opcjonalnie "abstract" jeśli nie chcesz dostarczać ciała
> metody w klasie bazowej.
>
> type Dzialanie= class
> public
>    procedure PrintOperator(); virtual; abstract;
>
> W klasie potomnej redeklarujesz metodę z modyfikatorem "override".
>
> type Mnozenie = class(Dzialanie)
> public
>    procedure PrintOperator(); override;
>
>
> procedure Mnozenie.PrintOperator();
> begin
>    Print('*');
> end;
>
> i teraz dla kodu:
>
>    var zmienna: Dzialanie.
>
>    zmienna = Mnozenie.Create();
>
> Przy wywołaniu
>    zmienna.PrintOperator();
>
> Zostanie wykonana wersja metody z Mnozenie. A skoro tak, to może ona
> używać wszystkich zmiennych z Mnozenie.
>
>
> BTW do tak prostego zadanie nie musisz nawet mieć zmiennej. Operator
> może być hardkodowany w implementacji funkcji. To dość typowe
> zastosowanie funkcji wirtualnych.
>
>

Sorki, języki mi się pomieszały, ta grupa jest do Javy... Chociaż zasada 
działania ta sama. Dodatkowo w Javie wszystkie funkcje są wirtualne, 
więc nie trzeba tego jawnie deklarować, poza "abstract".

kod:

class Dzialanie {
   public abstract void printOperator();
}

class Mnozenie extends Dzialanie {
   @Override
   public void printOperator() {
     System.out.print('*');
   }
}

i użycie:

   Dzialanie zmienna = new Mnozenie();

   zmienna.printOperator();

Adnotacja "@Override" jest opcjonalna, ale zwiększa czytelnoć kodu i 
bardzo pomaga przy refaktoringu, więc lepiej zawsze ją pisać.

-- 
Arivald
Re: Zmienna z klasy potomnej w klasie bazowej
#153624
Author: TrzyLinie
Date: Sun, 28 Oct 2012 08:40
4 lines
1342 bytes
W dniu 2012-10-28 02:12, Krzysztof Rudnik napisał(a):
> Zrób metodę pure virtual.

W świecie Javy wszystkie wywołania metod są wirtualne...
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads