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?
[Java] Dziedziczenie i polimorfizm
-
- 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
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.
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.
[Java] Dziedziczenie i polimorfizm
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?
-
- 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
Możesz rzutować:
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.
Kod: Zaznacz cały
// zakladam, ze zmienna pojazd zwiera jakiś pojazd, może osobowy:
try{
Osobowy osobowy = (Osobowy) pojazd;
osobowy.setRower();
} catch(ClassCastException e){}
Lepiej byłoby to zrobić za pomocą refleksji, ale byłoby sporo tłumaczenia, jeśli chcesz to sobie o niej poczytaj.
[Java] Dziedziczenie i polimorfizm
Dzięki za radę, rozwiązałem swój problem następująco:
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?
Dla jasności napisze jeszcze raz: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;
}
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?
-
- 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
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.
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.