Cecha (programowanie obiektowe)

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacja, szukaj

W językach obiektowych cecha (ang. trait) jest mechanizmem współdzielenia zachowania klas podobnym do domieszek, który pozwala ominąć część ograniczeń pojedynczego dziedziczenia. Cechy zostały opracowane w Software Composition Group na Uniwersytecie w Bernie[1].

Problem[edytuj | edytuj kod]

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[edytuj | edytuj kod]

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[edytuj | edytuj kod]

Cechy występują w języku Scala, PHP[3], implementacji Smalltalka o nazwie Squeak oraz w Perlu 6, gdzie noszą nazwę ról. Zaimplementowano je także w postaci dodatkowej biblioteki rozszerzającej oryginalny język w Perlu 5 (biblioteka Moose) oraz JavaScript (biblioteka Joose).

Przypisy

  1. Nathanael Schärli, Stéphane Ducasse, Oscar Nierstrasz, Andrew Black: Traits: Composable Units of Behaviour (ang.). Listopad 2002. [dostęp 4 stycznia 2010].
  2. Request for Comments: Horizontal Reuse for PHP (ang.). wiki.php.net. [dostęp 4 stycznia 2010].
  3. Traits (ang.). PHP Manual. [dostęp 2012-03-03].