Dziedziczenie i rzutowanie - pytanie

0

Mam pytanie odnośnie relacji dziedziczenia. Weźmy dla przykładu taki kod:

class Pracownik
{
//jakiś kod, nieistione
}
class Szef extends Pracownik
{
//jakiś kod, nieistione
}

W tym wypadku nadklasą jest klasa Pracownik. Poniższy kod jest poprawny

Pracownik []zespol = new Pracownik[5];
Szef manager = new Szef();
zespol[1] = manager; 

natomiast gdybym chciał z pracownika zrobić managera, to dlaczego coś takiego jest niepoprawne i chciałbym zapytać dlaczego. Czy chodzi tutaj po prostu najzwyklej w świecie o łańcuch dziedziczenia i jest to niemożliwe z uwagi na specyfikę tej relacji.

manager = zespol[1];
1

Są użytkownicy tego forum. Są też moderatorzy, którzy są użytkownikami tego forum. Czy możesz wziąć dowolnego użytkownika i powiedzieć, że to moderator forum?

0

No, tak, ale jeśli z konkretnego użytkownika bym chciał zrobić moderatora to muszę najpierw utworzyć obiekt klasy Moderator i podać tam dane mojego użytkownika, tak? Innej metody nie ma?

0

No zasadniczo jak chce się mieć obiekt jakiegoś typu to trzeba go stworzyć.

Aczkolwiek, jak zauważył @AnyKtokolwiek, do Twojej sytuacji bardziej pasuje kompozycja i wykorzystanie polimorfizmu w ten sposób a nie dziedziczenie.

1
Klasa Osoba
- string imie
- string nazwisko

Klasa OsobaMajacaPlec dziedzicząca po klasie Osoba
- boolean czyMezczyzna

osobnik = new Osoba("Tomek", "Polak")
osobnikMajacyPlec = (OsobaMajacaPlec) osobnik

osobnikMajacyPlec.czyMezczyzna == ?

Program musiałby się domyślać wartości cech klasy na którą rzutujesz, nie potrafi tego zrobić, dlatego kod jest niepoprawny.

1
Tomek Polak napisał(a):

No, tak, ale jeśli z konkretnego użytkownika bym chciał zrobić moderatora to muszę najpierw utworzyć obiekt klasy Moderator i podać tam dane mojego użytkownika, tak? Innej metody nie ma?

To zła ścieżka myślenia.

To jest właśnie przykład przesadnego dziedziczenia. Wiem, ze w dydaktyce jakoś w to brną. Czujesz, że to stwarza problem na własne życzenie?
Podczas swojego życia obiekt nie jest w stanie zostać szefem (moderatorem) , ani przestać.

Często się przypomina, aby szukać kompozycji zamiast dziedziczenia, i tu idealnie pasuje:
Osoba MA ROLĘ Szefa, lub jej nie ma. Albo miał, ale już nie ma itd... Można iść w stronę, ze ról można mieć wiele (być Szefem oraz Moderatorem)

class Szef : Rola {
}
class Moderator : Rola {
}

Stosowną klasę Osoba napisz sobie sam.

UPDATE: przykładem prawidłowego, choć szkolnego dziedziczenia, jest class Jabłko : Owoc. Jabłko, od swojego początku do końca JEST owocem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.