Spodziewajcie się teraz artykułów dotyczących programowania jedynie z samej Javy. Dobra, 99%. Z tego względu iż "raylib" nie będzie już przeze mnie wykorzystywany bo mnie zawiódł, nauka języka C została przeze mnie przerwana. Skupię się teraz na Javie z kilku osobistych powodów. Dzisiaj, rozwiązanie zagadki czemu dziedziczenie wielokrotne nie jest dopuszczalne. Wpierw należy sobie wytłumaczyć co się kryje konkretnego pod tym terminem. Zapraszam wszystkich zaintrygowanych!

DZIEDZICZENIE WIELOKROTNE - TAJEMNICZE HASŁO

Termin w nagłówku oznacza możliwość dziedziczenia danych składowych i metod z kilku klas jednocześnie. Gdy widzi się ten termin, od razu utożsamiane jest to z językiem C++, bo tam taka możliwość istnieje. Nie będę się próbował wymądrzać na temat tego języka, sam o nim niczego jeszcze nie wiem. Pozwala to na "scalenie" danych składowych i metod publicznych (ewentualnie chronionych) i zaaplikowanie ich prosto do obiektu, który będzie pochodził z tej klasy "hybrydowej".

Java na taki numer nie da się nabrać! W standardzie języka jest ściśle ustalone, że jedna klasa może dziedziczyć od TYLKO JEDNEJ klasy i nie ma możliwości, aby dziedziczenie wielokrotne zostało skompilowane i uruchomione. Tylko interfejsy można wiele razy implementować do jednej klasy. Spróbujmy się zastanowić czy nie stoi za tym jakiś konkretny uzasadniony powód zastosowania takiej restrykcji. Czemu to musi być zabronione? Czy może dojść do jakiegoś zagrożenia na tym tle?

PROBLEM "ŚMIERTELNEGO ROMBU"

W ostatecznym rozrachunku okazuje się, że dziedziczenie wielokrotne może być ryzykowne i wcale nie mam na myśli powiązania słowa "ryzykowny" z wyjątkami. Istnieje zagrożenie zetknięcia się z pewnym dylematem rozróżniania metod. Problem "śmiertelnego rombu" (ang. "diamond problem") polega na wystąpieniu sytuacji w której wywołujemy jedną z metod znajdujących się w obu dziedziczonych klasach w klasie potomnej która, co ważne, w obu miejscach posiada tę samą nazwę i listę parametrów formalnych! W wyniku niemożności rozróżnienia przez kompilator o jaką metodę konkretnie może nam chodzić, dochodzi do problemu uznanego za niemożliwy do rozwiązania.

Pomyślcie sami zanim zadacie sobie pytanie "a może jest jakaś możliwość, tylko jej nie wymyślono?". Dziedziczenie wielokrotne nie patrzy na "sąsiada" czy ma tę samą metodę, parametry i czy nawet ich kolejność jest taka sama! Gdy dochodzi do instrukcji wywołania metody, nie da się zdecydować z której klasy chcemy ją wywołać. Program nie może się "zdecydować" i może się brutalnie zakończyć przerywając proces o kodzie wyjściowym różnym od zera (informacja, że proces nie został zakończony w sposób pożądany).

Język Java został tak skonstruowany, aby "łatał" wszystkie niedoskonałości języka C++ oraz konstrukcje uznane za "zbyt trudne". Ale koniec końców, żeby przybierał postać C++ oferując w prezencie "gotowce". To jest cała historia dlaczego dziedziczenie wielokrotne zostało zablokowane.

Dziedziczenie wielokrotne w Java

Problem "śmiertelnego rombu" pojawia się w chwili wywoływania metody znajdującej się w obu / wielu dziedziczonych klasach mającej identyczną postać. Z tego powodu zabronione jest dziedziczenie wielokrotne w języku Java.


Tyle w temacie dziedziczenia. Do zobaczenia!

PODOBNE ARTYKUŁY