Polimorfizm czy dziedziczenie - która odpowiedź jest prawidłowa?

0

Załóżmy istnienie (np. w Javie) definicji klasy bazowej Base i klasy potomnej Child.

Klasa Base udostepnia metody:

  • void A()
  • void B()

Klasa Child extends Base definiuje zaś tylko:

  • void B()
Child child = new Child();
// przykład 1
child.A();
// przykład 2
child.B();

Pytanie starego egzaminatora:

"Koncepcja związana z programowaniem obiektowym, użyta w przykładzie X to?"
a. polimorfizm
b. dziedziczenie

W pierwszym przypadku wywołana zostanie metoda klasy bazowej.
W drugim przypadku wywołana zostanie metoda klasy potomnej, przesłaniająca metodę klasy bazowej.

Dla mnie oba przypadki realizują założenia polimorfizmu, chociaż w pierwszym zadziałało dziedziczenie metody z klasy bazowej.

Jaka jest poprawna odpowiedź?

0

W pierwszym dziedziczenie, w drugim polimorfizm.

0

Dzięki za odpowiedź!

A gdyby typ instancji klasy potomnej zmienić na Base, tj:

Base child = new Child();

child.A();
child.B();

to odpowiedź jest taka sama?

dodanie znacznika <code class="java"> - @furious programming

0

W pierwszym poście występuje dziedziczenie. Metoda A jest dziedziczona z klasy Base, natomiast metoda B jest nadpisywana przez Child.
Co zaś się tyczy polimorfizmu: http://pl.wikipedia.org/wiki/Polimorfizm_%28informatyka%29

Edit:
@randomcorwin to co podałeś w drugim poście to jest właśnie polimorfizm.

0

Ja w tym drugim przypadku nie widze zadnego dziedziczenia;p

0

Pozwólcie, że spróbuję podsumować:

  1. W przypadku instancji klasy Child, mamy wyłącznie dziedziczenie (wywołana dziedziczona metoda A i przesłonięta B) ?
  2. W przypadku zadeklarowania typu bazowego, który jest instancją klasy Child, mamy w obu przypadkach polimorfizm?

Dzięki za link do wikipedii, ale mimo lektury ciężko mi o jednoznaczną odpowiedź. Czytałem też kilka artykułów nt. i efekt był taki, że pod polimorfizm zacząłem podciągać odziedziczenie metody (np. na zasadzie, są różne odbiorniki ale każdy jest anteną, wszystkie oddziedziczyły metodę odbierz()).

Może podchodzę do problemu od złej strony - patrząc na deklarację klasy i jej budowę, zamiast na sposób, w jaki jest inicjowana?

Np. stworzenie kolekcji różnych elementów o wspólnym typie bazowym i wywoływanie na każdym z nich metody test() być może jest idealnym przykładem polimorfizmu, niezależnie od tego czy poszczególne klasy potomne dziedziczą metodę test() z bazowej, czy ją przesłaniają? Czy jednak każdą klasę potomną trzeba wtedy rozważyć indywidualnie?

0

Jeszcze suplement. W tym komentarzu na SO jest bardzo podobna sytuacja, autor twierdzi, że w przypadku prześłoniętej metody jest polimorfizm, a w przypadku dziediczonej... dziedziczenie. Zmienna przechowująca referencję do obiektu ma typ bazowy.

http://stackoverflow.com/a/6308416

0

Na tym właśnie polega polimorfizm. Operujesz na obiekcie typu bazowego natomiast nie jest istotne to czy rzeczywiście nim jest, czy może jest to obiekt, który powstał z klasy która dziedziczy z tegoż typu lub gdzieś w hierarchii dziedziczenia jest ten typ bazowy. Ważne, aby w hierarchii dziedziczenia ten obiekt występował, bo w tedy mamy pewność, że będzie on posiadał metody i pola, które są nam potrzebne.

0

Głupio mi ciągnąć temat, ale brakuje mi odpowiedzi wprost co do tych odziedziczonych metod. Jeśli odwołujemy się do metody z klasy pochodnej, która jest odziedziczona z bazowej, to chyba ani kompilator, ani maszyna wirtualna nie musi podejmować decyzji, którą metodę dowiązać - jest tylko jedna, odziedziczona.

Plus cytując:
http://beginnersbook.com/2013/03/polymorphism-in-java/

Following concepts demonstrate different types of polymorphism in java.

  1. Method Overloading
  2. Method Overriding
Base child = new Child();
child.B() // metoda dziedziczona z Base

W takim przypadku nie będzie ani przeciążenia, ani przesłonięcia. To na pewno polimorfizm?

0

Tak, ponieważ tu nie chodzi o to do jakiej metody się odwołujesz. Nie jest istotne czy była przesłonięta / przeciążona przez klasę pochodną. Chodzi o to, żeby mieć dostęp do określonego zestawu metod / pól danej klasy, a to czy one były w jakiś sposób modyfikowane przez klasy pochodne to jest nieistotne.
Przykład: mamy telewizor, który może odbierać sygnał z anteny naziemnej lub satelitarnej. Dla telewizora nie jest istotne jaka antena jest do niego obecnie podłączona i jaki ona odbiera sygnał, nie interesuje go to. On chce tylko odebrać sygnał przetworzony przez antenę do sygnału, który on obsłuży.

0

Ok, ufam Ci na słowo :). Dzięki @freemp3 i @FakeAccount za pomoc!

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