Od mniej znaczy wykładniczo więcej
Jeśli C ++ i Java dotyczą hierarchii typów i taksonomii typów, Go dotyczy kompozycji.
programming-languages
go
composition
CMinus
źródło
źródło
To pytanie / problem jest trochę podobne do tego .
W Go tak naprawdę nie masz OOP.
Jeśli chcesz „specjalizować” obiekt, robisz to przez osadzenie, które jest kompozycją, ale z pewnymi dodatkami, które częściowo przypominają dziedziczenie. Robisz to w ten sposób:
W tym przykładzie ConnexionMysql jest rodzajem specjalizacji * sql.DB i można wywołać w ConnexionMysql funkcje zdefiniowane w * sql.DB:
Na pierwszy rzut oka możesz więc pomyśleć, że ta kompozycja jest narzędziem do stworzenia zwykłej taksonomii.
Ale
jeśli funkcja zdefiniowana w * sql.DB wywołuje inne funkcje zdefiniowane w * sql.DB, nie wywoła funkcji przedefiniowanych w ConnexionMysql, nawet jeśli one istnieją.
W przypadku dziedziczenia klasycznego często robisz coś takiego:
Oznacza to, że definiujesz
doComplexThing
w superklasie jako organizację na wezwanie specjalizacji.Ale w Go nie wywołałoby to funkcji specjalistycznej, ale funkcję „nadklasy”.
Jeśli więc chcesz mieć algorytm, który musi wywoływać niektóre funkcje zdefiniowane w * sql.DB, ale przedefiniowane w ConnexionMySQL (lub innych specjalizacjach), nie możesz zdefiniować tego algorytmu jako funkcji * sql.DB, ale musisz go zdefiniować gdzie indziej a ta funkcja będzie składać tylko połączenia z podaną specjalizacją.
Możesz to zrobić za pomocą interfejsów:
Jest to całkiem odmienne od klasycznego przesłonięcia hierarchii klas.
W szczególności, oczywiście nie możesz bezpośrednio mieć trzeciego poziomu dziedziczącego implementację funkcji od drugiego.
W praktyce przestaniesz używać głównie (ortogonalnych) interfejsów i pozwolisz, aby funkcja tworzyła wywołania na dostarczonej implementacji zamiast organizować te wywołania przez „nadklasę” implementacji.
Z mojego doświadczenia wynika, że prowadzi to do praktycznego braku hierarchii głębszych niż jeden poziom.
Zbyt często w innych językach masz odruch, gdy widzisz, że pojęcie A jest specjalizacją pojęcia B, aby to potwierdzić, tworząc klasę B i klasę A jako podklasę B. Zamiast tworzyć programując wokół danych, spędzasz czas na odtwarzaniu taksonomii obiektów w kodzie, na zasadzie, że jest to rzeczywistość.
W Go nie można zdefiniować ogólnego algorytmu i go specjalizować. Musisz zdefiniować ogólny algorytm i upewnić się, że jest on ogólny i działa z dostarczonymi implementacjami interfejsu.
Będąc przerażonym rosnącą złożonością niektórych drzew hierarchicznych, na których koderzy robili skomplikowane włamania, aby dostosować się do algorytmu, którego logika w końcu implikuje wszystkie poziomy, powiedziałbym, że jestem zadowolony z prostszej logiki Go, nawet jeśli wymusza zamiast myśleć o koncepcjach modelu aplikacji, musisz pomyśleć.
źródło