[Java] Dziedziczenie i polimorfizm

Kazorx
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 28 wrz 2008, o 12:48
Płeć: Mężczyzna
Lokalizacja: Wrocław

[Java] Dziedziczenie i polimorfizm

Post autor: Kazorx »

Zaczynam swoją przygodę z javą i napotkałem na pewnien problem który jest dla mnie niezrozumiały. Dla ścisłości programuje w BlueJ ktory nie wymaga takich rzeczy jak klasa Main itp, stosujemy go na uczelni dlatego używam go też w domu.

Piszę program wykorzystujący dziedziczenie i polimorfizm.

Główna klasa "Pojazd", po tej klasie dziedziczą klasy "Osobowy" i "Ciezarowy" do tego mamy klase "Parking" która pełni właściwie rolę klasy Main i służy do testowania programu. W klasie "Pojazd" mam zdefiniowane wszystkie potrzebne mi setery itp. Natomiast w klasie "Osobowy" mam zdefiniowaną metodę "public boolean setRower()"

Teraz w klasie "Parking" mam 2wymiarową tablicę obiektów Pojazd, chce napisać tam metodę ktora będzie korzystała z metody setRower(), jak to zrobic?

Pisałem początkowo:

pojazd[wiersze][kolumny].setRower(); i po tym kompilator sypał "Nie może znaleźć metody setRower()"

zadziałało dopiero jak zrobiłem w klasie Pojazd metodę setRower() która w ciele nie ma dosłownie nic...

Co to ma do rzeczy? Dlaczego w klasie Pojazd musiała być taka metoda?

Czy to nie troche bez sensu? Co w przypadku gdy jeden programista pisze metodę Pojazd i pozwala innemu programiscie dziedziczyc po klasie Pojazd, ten drugi programista wie tylko co zawiera klasa Pojazd ale nie moze do niej nic dopisac, jak w takiej sytuacji rozwiązać mój problem? Jak odwołać się do metody klasy potomnej bez przesłaniania metody klasy bazowej?
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[Java] Dziedziczenie i polimorfizm

Post autor: soku11 »

No to zauważ jedną rzecz. Dodajemy do klas dziedziczących z klasy Pojazd klasę Czołg. Teraz do klasy Czołg dodajemy metodę strzelaj(). I można się teraz zapytać, czemu klasa Pojazd nie ma metody strzelaj()? Odpowiedź jest w miarę oczywista. Nie każdy Pojazd jest czołgiem => nie każdy strzela. W związku z tym metoda strzelaj() nie może być w klasie Pojazd. A jak nie ma jej w klasie Pojazd, to nie można jej wywołać. Jeśli chcesz się posłużyć klasą czołg, to musisz mieć referencję na typ Czołg, a nie pojazd. Wtedy masz dostęp do tej metody i metod dziedziczonych z klasy Pojazd.
Analogicznie jest u ciebie. Niby jak chcesz wywołać metodę, której nie ma? Dodatkowo co to za metoda setRower()? Jeśli jest ona charakterystyczna tylko dla Pojazdów Osobowych, to jakim cudem zakładasz, że jest ona dostępna dla każdego pojazdu? Tak to niestety nie działa...
Rozwiązanie: Jeśli chcesz manipulować na obiektach typu Osobowe, to twórz referencje na Osobowe, a nie na Pojazdy.

Pozdrawiam.
Kazorx
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 28 wrz 2008, o 12:48
Płeć: Mężczyzna
Lokalizacja: Wrocław

[Java] Dziedziczenie i polimorfizm

Post autor: Kazorx »

No tak, masz racje, ale zastanawiam się jak w takim układzie zrobic moj program. Generalnie chodzi o to ze w moim programie miałem miec parking na ktorym parkuje zarowno samochody osobowe jak i ciezarowe. Czyli jak wnioskuje tablica jaką jest ów parking musi być tablicą pojazdów, bo inaczejc hyba nie zapisze do niej raz obiektu klasy osobowy a raz klasy ciezarowy prawda?
spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

[Java] Dziedziczenie i polimorfizm

Post autor: spajder »

Możesz rzutować:

Kod: Zaznacz cały

// zakladam, ze zmienna pojazd zwiera jakiś pojazd, może osobowy:
try{
    Osobowy osobowy = (Osobowy) pojazd;
    osobowy.setRower();
} catch(ClassCastException e){}
Jeśli dany pojazd jest osobowy wywoła się setRower, jeśli nie przejdzie do kodu obsługi wyjątku.
Lepiej byłoby to zrobić za pomocą refleksji, ale byłoby sporo tłumaczenia, jeśli chcesz to sobie o niej poczytaj.
Kazorx
Użytkownik
Użytkownik
Posty: 27
Rejestracja: 28 wrz 2008, o 12:48
Płeć: Mężczyzna
Lokalizacja: Wrocław

[Java] Dziedziczenie i polimorfizm

Post autor: Kazorx »

Dzięki za radę, rozwiązałem swój problem następująco:
public boolean rower_WSTAW_ZESTAW(int wiersz, int kolumna){
if(pojazd[wiersz][kolumna]!=null){
if(pojazd[wiersz][kolumna] instanceof Osobowy){
osobowy=(Osobowy)pojazd[wiersz][kolumna];
osobowy.setRower();
pojazd[wiersz][kolumna]=osobowy;
return true;
}
}
return false;
}
Dla jasności napisze jeszcze raz:
Pojazd pojazd[][] = new Pojazd[10][10]; <- tak wyglada wczesniej stworzona tablica pojazdów, jest to moj parking.

Klasa "Osobowy" dziedziczy po klasie Pojazd, wiec w tej metodzie dokonuje sprawdzenia czy w danym polu tablicy pojazd[][] znajduje się obiekt klasy osobowy jeśli tak to zmiennej obiektowej "osobowy" przypisuje pole tablicy rzutowane na Osobowy i teraz juz bez problemu wywołuje w obiekcie osobowy metodę klasy Osobowy.

Zapewne jest to nakombinowane jak pod górkę, ale działa i wydaje mi sie ze działa poprawnie wiec myśle ze takie rozwiazanie jest do przyjecia. Co o tym sadzicie?
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[Java] Dziedziczenie i polimorfizm

Post autor: soku11 »

Sądzę, że coś motasz, skoro musisz używać takich konstrukcji. instanceof używałem tylko i wyłącznie przy programowaniu obsługi zdarzeń w bodajże swingu (kontrolki,suwaki,etc).
Dlatego sądzę, że po prostu coś w samym projekcie aplikacji zepsułeś. Skoro parking zawiera pojazdy, to może manipulować tylko na pojazdach. Ale to tylko moje zdanie.

Pozdrawiam.
ODPOWIEDZ