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
Author: Smok
Date: Sat, 27 Oct 2012 16:41
Date: Sat, 27 Oct 2012 16:41
5 lines
1271 bytes
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
Author: npe
Date: Sat, 27 Oct 2012 21:20
Date: Sat, 27 Oct 2012 21:20
45 lines
1477 bytes
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
Author: Krzysztof Rudnik
Date: Sun, 28 Oct 2012 00:12
Date: Sun, 28 Oct 2012 00:12
12 lines
1218 bytes
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
Author: Arivald
Date: Sun, 28 Oct 2012 07:48
Date: Sun, 28 Oct 2012 07:48
52 lines
2517 bytes
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
Author: Arivald
Date: Sun, 28 Oct 2012 07:59
Date: Sun, 28 Oct 2012 07:59
83 lines
3295 bytes
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
Author: TrzyLinie
Date: Sun, 28 Oct 2012 08:40
Date: Sun, 28 Oct 2012 08:40
4 lines
1342 bytes
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