Zmienna referencyjna typu klasy bazowej, a instancja obiektu klasy pochodnej.

0

Chciałbym się dowiedzieć w jakim celu tworzymy instancję klasy pochodnej od zmiennej referencyjnej typu bazowego ?
Czyli założmy mamy hierarchie Pszczola i po niej dziedziczą Królowa i Robotnik.
I ta linijka mnie zastanawia :

 Pszczola pszczola = new Królowa();

Czemu nie lepiej od razu zrobić tak:

 Królowa pszczola = new Królowa();

W jakim celu stosuję się ten pierwszy zapis ?

1

poczytaj o polimorfizmie, poczytaj o interfejsach, poczytaj o wzorcach projektowych.

0

Akurat podany przez Ciebie przykład faktycznie jest mało opisowy.

Wyobraź sobie na przykład funkcję ZbierzMiod przyjmującą jako jeden z argumentów instancję klasy Pszczola i załóżmy, że zarówno królowa, jak i robotnice zbierają miód*.
W takim przypadku tworzenie osobnych metod dla obydwu konkretnych klas mija się z celem, ponieważ to generalnie pszczoły wykonują tę akcję.

* jestem programistą, nie biologiem.

0

Czytałem o polimorfizmie i właśnie przerabiam interfejsy.
Co do polimorfizmu to podczas wywołania metody która została "przesłonieta" w klasie pochodnej, wtedy już niezależnie od typu zmiennej referencyjnej zostanie wywołana metoda zgodna z typem obiektu.

Pszczoła pszczoła = new Królowa(); 
pszczoła.Wyświetl() 

tutaj zostanie wywołana metoda zgodna z typem obiektu, a nie zmiennej referencyjnej.

Co do linijki z pierwszego postu. To jedyne jej wykorzystanie, według mnie przydaję się kiedy byśmy chcieli przejść po calej hierarchi klas czyli tych pszczól ( gdybyśmy mieli naprawdę dużą hierarchie)

0

Problem rozwiązany poczytałem trochę o "is" , "as" ;p

1

Jako, że teraz piszę sobie mały programik do szachów to mogę Ci dać przykład rzeczywistego tego użycia (mam nadzieję, że jest dobry):

Mamy klasę ChessGame która jak nazwa wskazuje obsługuję grę w szachy. No i teraz pojawia się mały problem - ChessGame musi mieć w sobie 'graczy' którzy wykonują ruch.
A więc mamy klasę Player która posiada metodę Move() i zwraca jakąś klasę posiadająca pola które zawierają jaki ruch został wykonany. No i teraz jest mały problem. Bo co się dzieje kiedy graczy jest więcej niż jeden rodzaj ?

Dla przykładu: Jeżeli graczem jest człowiek metoda Move() będzie pobierała to, jaki użytkownik wykonał ruch. Jeżeli natomiast graczem jest silnik szachowy to metoda Move() będzie zwracała przeparsowany ruch od silnika szachowego. A więc z klasy Player możemy mieć klasy : CPUPlayer HumanPlayer i każda z nich będzie posiadała metodę Move().

Teraz wracając do klasy ChessGame - ją nie obchodzi jaki dokładnie typ ma Player (Human czy CPU) tylko ją obchodzi to, aby można było wywołać Move() i odpowiednio to obsłużyć więc obchodzi ją tylko typ bazowy Player który posiada Move() i go wywołuje a to jak jest to zaimplementowane pozostaje nieistotne z punktu widzenia ChessGame.

Mam nadzieję, że chociaż trochę jest to bardziej jasne.

Pozdr.

1 użytkowników online, w tym zalogowanych: 0, gości: 1