Jak skorzystać z metody w podklasie?

0

Cześć.
Mam proste klasy: Ryby i Ptaki które są rozszerzane klasą abstrakcyjną Zwierzęta.
Tworzę kilka obiektów Ryby i Ptaki typu Zwierzęta.
W klasie abstrakcyjnej mam wszystkie metody abstrakcyjne które są wspólne ale dla każdej z "grup" ale działają trochę inaczej.
W klasie Ptaki utworzyłem metodę Nakarm() i tylko dla niej ma działać.
Pyt 1. Czy oprócz rzutowania na dany obiekt Ryby można dostać się jakoś do tej metody? Mógłbym ją dodać w klasie abstrakcyjnej ale nie chcę tego robić ponieważ nie chcę aby była ona dostępna w klasie Ptaki.
Pyt 2. Dopiero się uczę więc czy takie tworzenie metod jest w porządku (niejako odbiega to trochę od polimorfizmu) czy powinno się jednak robić to w jakiś inny określony sposób?

Pozdrawiam,
~eL

0
  1. Ryba i Ptak rozszerzają Zwierzę
  2. Konwencja zakłada nazwy metod z małej litery
  3. Jeśli musisz rzutować w dół albo sprawdzać typy to coś jest bardzo nie tak. Skoro potrzebujesz wiedzieć czy masz do czynienia z ryba czy z ptakiem to nie trzymaj ich w kolekcji zwierząt, bo mija się to z celem.
0
Shalom napisał(a):
  1. Ryba i Ptak rozszerzają Zwierzę
  2. Konwencja zakłada nazwy metod z małej litery
  3. Jeśli musisz rzutować w dół albo sprawdzać typy to coś jest bardzo nie tak. Skoro potrzebujesz wiedzieć czy masz do czynienia z ryba czy z ptakiem to nie trzymaj ich w kolekcji zwierząt, bo mija się to z celem.
  1. Racja, źle się wyraziłem.
  2. Tak tak, masz racje i wiem o tym. Skupiłem się bardziej na problemie a nie całą resztą.
  3. W zasadzie nie jest to żadna aplikacja a jedynie moja nauka o abstrakcji/polimorfizmie i na takim przykładzie ćwiczę. A pytam dlatego że wolałbym właśnie unikać rzutowania w takim przypadku.
    Czyli jeśli jakieś klasy rozszerzają klasę abstrakcyjną, to prawidłowo nie powinny one zawierać żadnych odrębnych metod a jedynie metody wspólne dla obu klas?
2

Nie, nie o to chodzi. Lekcja na dziś: zasada separacji interfejsów http://en.wikipedia.org/wiki/Interface_segregation_principle
Chodzi o to że powinieneś mieć jasno zdefiniowane interfejsy i za ich pomocą używać obiektów. To nie jest problem że jakaś podklasa ma więcej metod niż jej klasa bazowa, to jest zupełnie naturalna sprawa. Ale jeśli trzymasz gdzieś kolekcję obiektów jako obiekty klasy bazowej to znaczy że korzystasz tylko z tego co oferuje klasa bazowa i z niczego więcej. Jeśli potrzebujesz coś więcej to korzystasz z jakiegoś innego / szerszego interfejsu.
Jeśli masz więcej zwierzątek które można nakarmić to zrób interfejs Feedable z tą jedną metodą i niech te klasy ją implementują. Potem jeśli w jakiejś metodzie chcesz karmić to przyjmuje do tej metody 'obiekty' Feedable i już.

0
eL napisał(a):

W klasie Ptaki utworzyłem metodę Nakarm() i tylko dla niej ma działać.
(...) nie chcę aby była ona dostępna w klasie Ptaki.

Czy tylko ja tu widzę sprzeczność? Zakładam, że nakarm ma być w klasie Ryba

W Twoim przypadku Ryba powinna implementować interfejs (np. Udomowione), który definiuje metodę nakarm. Możesz trzymać osobne kolekcje dla udomowionych, dzikich i wszystkich. Tu dużo zależy od tego co program robi.

0

Racja, trochę namieszałem. Czyli jeśli potrzebuję pojedynczy obiekt np Ryba albo Ptak to wówczas tworzę go jak każdy inny normalny obiekt na zasadzie:

Ryba jakasRyba= new Ryba();
Ptak jakisPtak= new Ryba();

i wówczas mam dostęp do metod i z klas Ryba/Ptak jak również z klasy abstrakcyjnej Zwierzęta.

A jeśli potrzebuję działać na wszystkich obiektach to tworzę np. tablicę obiektów

Zwierzeta[] zwierze = new Zwierzeta[5];
zwierze[0]=new Ptak()

itd... I powinienem wykorzystywać tylko i wyłącznie metody zdefiniowane w klasie Zwierzeta.
Dobrze rozumiem ?

Tworzenie takiego obiektu np:

Zwierze ryba=  new Ryba();

Jest bezsensu?

Ps. Sarrus - racja, źle to napisałem ;) Chodziło o to żeby Ryba posiadała metodę nakarm() a Ptak nie.

dodanie znaczników <code class="java"> - fp

0

@eL nie jest bez sensu, o ile planujesz tych obiektów używać jako Zwierzęta. Jeśli planujesz korzystać z metod specyficznych dla danego zwierzęcia to nie ma sensu.

0

Trochę niejasno się wyrażam aczkolwiek chodziło mi o to że bezsensu jest w moim przypadku. Okej, już rozumiem. Dzięki Panowie, mocno mi to sprawę rozjaśniło!
Temat rozwiązany, dziękuję bardzo!

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