Dzisiaj mój profesor skomentował, że to dziwne, że chociaż filozofia SWT polega na tworzeniu własnych kontroli przez kompozycję, Swing wydaje się faworyzować dziedziczenie.
Prawie nie mam kontaktu z obiema platformami, ale z tego, co pamiętam w Windows Forms C #, zwykle rozszerza się sterowanie, podobnie jak Swing.
Ponieważ ludzie zazwyczaj wolą kompozycję niż dziedziczenie, dlaczego ludzie z Swing / Windows Forms nie preferowali kompozycji zamiast dziedziczenia?
Odpowiedzi:
JComponent
ujawnia wiele funkcjonalności . GdybyJComponent
był interfejs i komponenty zostały zaimplementowane z kompozycją, proste komponenty musiałyby mieć dziesiątki prostych metod pakowania, npIstnieje również powód wydajności, aby preferować dziedziczenie nad kompozycją - przesłonięcie nic nie kosztuje (zakładając brak
super
wywołania), a kompozycja kosztuje dodatkowoINVOKEVIRTUAL
. Nie wiem, czy wpłynęło to na projekt Swinga, ale jest to duży problem dla klas kolekcji.źródło
Swing Framework jest w rzeczywistości zaprojektowany zgodnie z Composite Design Pattern. Przyznaję, że jest tam wiele dziedziczenia, ale zwykle komponowałbyś własne formy przy użyciu kompozycji. Oznacza to, że forma jest kompozycją pojemników i kontroli poziomu pośredniego.
źródło
W Javie dużo łatwiej jest korzystać z dziedziczenia tylko dlatego, że wszystko jest wirtualne. Chcesz naprawić „funkcję” w JTable / JFrame? Rozszerz go, zastąp metody problematyczne, a następnie użyj wszędzie tabeli / ramki.
Myślę o takich rzeczach jak WPF, gdzie powiązanie danych jest podstawową cechą projektu, znacznie ułatwia tworzenie kompozycji zamiast dziedziczenia.
źródło
virtual
, i aby ją zastąpić, jawnie zadeklaruj ją jakooverride
. W Javie można zastąpić nic widać i można zwiększyć swoją widoczność w podklasie (można dokonać metodami chronione publicznego w podklasie!)final
metody w Javie, nawet jeśli sama klasa podstawowa nie jestfinal
.W Effective Java , pozycja 17, Bloch wspomina, że klasa zaprojektowana do dziedziczenia „musi udokumentować swoje samodzielne stosowanie nadrzędnych metod”. Znakiem rozpoznawczym tego jest zwrot „ implementacja” . Zobaczysz to w klasach takich jak
JTable
iJInternalFrame
. Jest to jedna miara dziedziczenia według projektu w Swing.źródło
Od C # 3.5 mamy pojęcie nazywane jako Metody Rozszerzenia, które pozwalają na pojęcie składu niż dziedziczenia.
W tym procesie implementujemy rozszerzoną funkcjonalność do istniejącej klasy poprzez dodanie klasy rozszerzającej, która renderuje nową funkcję do istniejącej klasy.
Więcej informacji można znaleźć tutaj
źródło