Co to jest kompozycja nad dziedziczeniem?
Składanie nad dziedziczeniem jest metodologią programowania stosowaną w obiektowych językach programowania, aby pomóc w ustanowieniu bardziej dynamicznych i zmiennych relacji między obiektami w aplikacji. Podstawowym formatem kompozycji zamiast dziedziczenia jest włączenie instancji obiektu do innego obiektu. Różni się to wyraźnie od obiektowej metody dziedziczenia, ale może służyć temu samemu celowi w wielu modelach. Do przewagi kompozycji nad dziedziczeniem należą dobrze zdefiniowane granice między obiektami złożonymi a obiektami opakowania, możliwość zmiany implementacji obiektu bez wpływu na całą hierarchię dziedziczenia oraz mniej restrykcyjne ramy dla wstępnego projektowania programu. Niektóre z komplikacji mogą jednak obejmować trudności w serializacji i zbyt skomplikowane struktury w dużych, ustalonych programach.
W programowaniu obiektowym jedną z cech, które należy ustalić podczas projektowania, jest to, w jaki sposób różne obiekty odnoszą się do siebie. Dziedziczenie jest centralnym mechanizmem w programowaniu obiektowym i pozwala jednemu obiektowi na dziedziczenie wszystkich danych i metod jego rodzica, które może następnie dodawać, modyfikować lub rozszerzać za pomocą własnej implementacji. Przykładem projektu opartego na dziedziczeniu może być program, który ma jedną główną klasę, która definiuje samochód i modeluje niektóre ogólne atrybuty wszystkich samochodów. Klasa dla każdej indywidualnej marki samochodu jest następnie tworzona jako potomek klasy głównej, ale definiuje określone informacje, takie jak wielkość silnika, pojemność paliwa lub inne informacje specyficzne dla tej konkretnej marki samochodu.
Kompozycja jest wyrażana poprzez uwzględnienie instancji obiektów w innych obiektach. Jeśli istnieje główna klasa, która definiuje ogólny samochód, to zamiast tworzyć podklasy dla określonych marek samochodów, główna klasa może zamiast tego zawierać instancje innych obiektów, które bardziej szczegółowo definiują samochód. Może to oznaczać, że główna klasa samochodów może zawierać obiekt dla typu silnika i jeden dla pojemności paliwowej, który byłby ustawiany, gdy klasa zostanie wykorzystana do stworzenia instancji określonej marki samochodu.
W przypadku kompozycji zamiast dziedziczenia obiekty zawarte w klasie głównej nie są bezpośrednio powiązane z klasą główną, co daje programistom swobodę zmiany sposobu działania poszczególnych obiektów. Problemem, w którym kompozycja zamiast dziedziczenia może pomóc, jest sytuacja, w której drzewo dziedziczenia może być nadmiernie głębokie, co oznacza, że wszelkie modyfikacje klasy w drzewie mogą wymagać zmian na całej długości drzewa. Nie wszystkie języki zorientowane obiektowo obsługują wiele dziedziczeń, a kompozycja zamiast dziedziczenia jest metodą, której można użyć w celu obejścia tego ograniczenia.