C ++ ma zwykłe wielokrotne dziedziczenie, wiele projektów językowych zabrania go jako niebezpiecznego. Ale niektóre języki, takie jak Ruby i PHP, używają dziwnej składni, aby robić to samo i nazywać to mixins lub cechami. Słyszałem wiele razy, że miksy / cechy są trudniejsze do nadużywania niż zwykłe wielokrotne dziedziczenie.
Co konkretnie czyni je mniej niebezpiecznymi? Czy jest coś, co nie jest możliwe w przypadku mixin / cech, ale jest możliwe w przypadku wielokrotnego dziedziczenia w stylu C ++? Czy można z nimi spotkać problem z diamentem?
Wydaje się, że używamy wielokrotnego dziedziczenia, ale po prostu usprawiedliwiamy, że są to miksy / cechy, abyśmy mogli ich użyć.
Odpowiedzi:
Istnieje wiele problemów z wielokrotnym dziedziczeniem, gdy jest ono używane z pełnoprawnymi klasami, ale wszystkie dotyczą niejednoznaczności .
Dwuznaczność ujawnia się na kilka różnych sposobów:
x
, a typ pochodny pyta ox
to, co on otrzymuje?x
zmienne mają niespójne typy, możesz je wywnioskować.f
i identycznymi podpisami, a ktoś dzwonif
, który zostaje wywołany?I to ignoruje takie rzeczy jak dynamiczne wysyłanie, wnioskowanie o typie, dopasowywanie wzorców i inne rzeczy, o których mniej wiem, które stają się trudniejsze, gdy język obsługuje wielokrotne dziedziczenie pełnych klas.
Cechy lub wtyczki (lub interfejsy lub ...) to konstrukcje, które konkretnie ograniczają możliwości danego typu, dzięki czemu nie ma dwuznaczności. Rzadko są właścicielami czegokolwiek. Pozwala to na płynniejszą kompozycję typów, ponieważ nie ma dwóch zmiennych lub dwóch funkcji ... istnieje zmienna i odwołanie; funkcja i podpis. Kompilator wie, co robić.
Innym powszechnie stosowanym podejściem jest zmuszanie użytkownika do „budowania” (lub mieszania) swojego typu pojedynczo. Zamiast klas podstawowych będących równorzędnymi partnerami w nowym typie, dodajesz jeden typ do drugiego - zastępując wszystko, co tam było (zwykle z opcjonalną składnią, aby zmienić nazwę i / lub ponownie ujawnić przesłonięte bity).
W zależności od języka - na ogół staje się kłopotliwe lub niemożliwe do scalenia implementacji funkcji i pamięci dla zmiennych z wielu klas bazowych i ujawnienia ich w typie pochodnym.
Czasami pojawiają się mniej poważne odmiany w zależności od języka, ale zwykle nie. Cały sens cech polega na przełamaniu tego rodzaju dwuznaczności.
źródło
with
robi słowo kluczowe.