Jason. Cała informatyka w jednym miejscu!

Dzisiaj rozwiązanie zagadki czemu dziedziczenie wielokrotne jest niedopuszczalne w językach wysokiego poziomu z wyjątkiem C++. Wpierw należy sobie wytłumaczyć co się kryje konkretnego pod tym terminem. Zapraszam wszystkich zaintrygowanych!

DZIEDZICZENIE WIELOKROTNE. WYJAŚNIENIE HASŁA

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. 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 (oraz wiele innych języków wysokiego poziomu) nie pozwoli na taki numer! 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" lub "deadly diamond of death") 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. Nie tylko w Javie, ale w większości innych języków programowania.

Dziedziczenie wielokrotne

"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 i w większości innych języków wysokiego poziomu.


Tyle w temacie dziedziczenia wielokrotnego. Do zobaczenia!

PODOBNE ARTYKUŁY