Tworzenie własnych komponentów (widgets) przez dziedziczenie w SWT
U¿ywam SWT od oko³o dwóch miesiêcy i jak do tej pory napotka³em tylko na jedn± rzecz, która mnie zirytowa³a. By³a to kolejno¶æ wykonywania siê metod reaguj±cych na zdarzenia (events). Dzi¶ rozczarowa³em siê faktem, ¿e w tej bibliotece zaleca siê tworzenie w³asych komponentów przez kompozycjê zamiast dziedziczenie.
Potrzebowa³em stworzyæ w³asny przycisk (Button), który zachowywa³by siê jak standardowy, jednak dodatkowo mia³by ustawione domy¶lny tytu³, grafikê i obs³ugê klikniêcia. Naturalne by³o utworzenie nowej klasy przez dziedziczenie z klasy Button, dodaj±c tylko wspomnian± funkcjonalno¶æ. Tak te¿ zrobi³em, jednak po uruchomieniu program wyrzuci³ wyj±tek SWTException z komunikatem "Subclassing not allowed" (dziedziczenie nie dozwolone). Ka¿da klasa komponentu (oprócz Canvas i Composite) sprawdza, czy jest on natywnym komponentem biblioteki. Je¶li test siê nie powiedzie wyrzucany jest wspomniany wyj±tek. Sprawdzenia dokonuje metoda checkSubclass(), któr± wystarczy przeci±¿yæ (jej cia³o mo¿e byæ puste), aby osi±gn±æ to co planowa³em.
Istnienie metody checkSubclass() nie ma na celu zapobie¿enia tworzenia komponentów przez dziedziczenie, ale tylko ograniczenie tego zjawiska (inaczej oznaczonoby klasê jako final). Twórcy wyt³umaczyli siê z tego w FAQ, gdzie broni± siê g³ównie mo¿liwo¶ci± utraty wieloplatformowo¶ci, kompatybilno¶ci miêdzy wydaniami biblioteki, powstawaniu ukrytych b³edów i wycieków pamiêci. Zaleca siê u¿ywania kompozycji. Nie spodoba³o mi siê to. Dziedziczenie (obok kompozycji) jest jednym z fundamentów programowania obiektowego i nie powinno siê go tak depresjonowaæ. Dokument dos³ownie zra¿a do dziedziczenia, a przecie¿ nie mo¿na go kompletnie zast±piæ kompozycj±. Co z polimorfizmem, pó¼nym wi±zaniem i rzutowaniem? FAQ wspomina, ¿e klasa tworzona przez dziedziczenie mo¿e wymagaæ przeci±¿enia wielu niepotrzebnych metod. Równie dobrze mo¿na odwróciæ sytuacjê i powiedzieæ, ¿e utworzenie klasy przez kompozycjê mo¿e wymagaæ powtórnej implementacji ju¿ istniej±cych metod.
Zdziwi³o mnie podej¶cie projektantów SWT do dziedziczenia, dobrze jednak, ¿e dali szansê zmiany domy¶lnego zachowania komponentów. My¶lê, ¿e na obie techniki programowania znajd± siê odpowiednie okazje. Rozumiem problemy wynikaj±ce z faktu, ¿e elementy biblioteki dzia³aj± i wygl±daj± w ka¿dym ¶rodowisku jak natywne. Mo¿na spokojnie tworzyæ w³asne dziedzicz±c z tych gotowych. Trzeba jednak to robiæ tylko tam gdzie jest to faktycznie niezbêdne i byæ ¶wiadomym ewentualnych zagro¿eñ.
¼ród³a:
1. The SWT FAQ
2. Creating Your Own Widgets using SWT