Cecha (programowanie obiektowe)

Z Wikipedii, wolnej encyklopedii

Cecha (ang. trait) – mechanizm współdzielenia zachowania klas podobny do domieszek, pozwalający ominąć część ograniczeń pojedynczego dziedziczenia. Cechy zostały opracowane w Software Composition Group na Uniwersytecie w Bernie[1].

Problem

W programowaniu obiektowym dwie klasy mogą współdzielić część funkcjonalności i implementacji wyłącznie wtedy, gdy wywodzą się ze wspólnej klasy bazowej (dziedziczenie). Większość języków programowania nie obsługuje wielokrotnego dziedziczenia po kilku klasach naraz z powodu powstających wtedy wielu patologii. Programiści tracą jednak dużą część przydatnych technik. Bardzo często potrzeba, aby używane w pewnym miejscu programu obiekty posiadały pewną funkcjonalność nawet, jeśli nie wywodzą się ze wspólnego rdzenia. Podstawowym sposobem rozwiązania tego problemu są interfejsy definiujące zestaw wymaganych metod, które klasa musi we własnym zakresie zaimplementować. W takim modelu klasa może dziedziczyć po jednej klasie bazowej oraz implementować dowolną liczbę interfejsów. Aby umożliwić niezależne od dziedziczenia wstrzykiwanie także implementacji, zaproponowane zostały dwa rozwiązania: bardziej skomplikowane domieszki oraz prostsze cechy.

Właściwości

Cechy są jedynie zbiorem dodatkowego kodu (metody oraz atrybuty), który może zostać wstrzyknięty do wybranych klas na etapie kompilacji. W przeciwieństwie do domieszek, podczas wykonywania program nie ma pojęcia o istnieniu cech, dlatego nie można w locie sprawdzić czy obiekt przekazany do funkcji obsługuje określoną cechę[2]. Nie można także tworzyć obiektów cech.

Klasy mogą importować dowolną liczbę cech, lecz nie istnieje żaden mechanizm rozwiązywania konfliktów, gdy dwie cechy próbują dodać identyczną metodę różniącą się implementacją. Rozwiązanie konfliktu pozostawione jest programiście, który może zrezygnować z dołączenia jednej z cech, wybrać jedną z implementacji lub zaimportować jedną ze spornych metod pod inną nazwą.

Implementacja

Cechy występują w języku Scala, PHP[3] (od wersji 5.4.0), implementacji Smalltalka o nazwie Squeak oraz w Perlu 6, gdzie noszą nazwę ról. Cechy są również istotnym elementem języka programowania Rust[4]. Zaimplementowano je także w postaci dodatkowej biblioteki rozszerzającej oryginalny język w Perlu 5 (biblioteka Moose) oraz JavaScript (biblioteka Joose). W Pythonie można z nich korzystać używając pakietów Traitsref[5] lub py3traits[6].

Przypisy

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.