Zpo-10-wyk-Slajd25
Replace Delegation with Inheritance
Bieżące przekształcenie jest komplementarne do poprzedniego, tzn. zamienia delegację na dziedziczenie. Zmiana taka wymaga lepszego uzasadnienia niż odwrotna transformacja, ponieważ zwykle powoduje usztywnienie schematu klas i utrudnia jego rozszerzanie. Jednak istnieją sytuacje, w których przekształcenie to jest uzasadnione, np. gdy klasa deleguje niemal wszystkie swoje wywołania do innej klasy, i nie zachodzi konieczność zmiany delegacji do innego obiektu w trakcie wykonywania programu.
W zasadzie przekształcenie przebiega w sposób dokładnie odwrotny do przedstawionego na poprzednich slajdach. Rozpoczyna się od wprowadzenia relacji dziedziczenia pomiędzy klasą delegowaną (która staje się nadklasą) a klasą bieżącą (od tego momentu podklasą). Następnie pole przechowujące referencję do delegacji ma wartość zmienianą na this . Od tego momentu klasy są związane podwójną relacją, dzięki której można w podklasie stopniowo zmieniać odwołanie do obiektu nadklasy z delegacji na dziedziczenie. Po przeniesieniu wszystkich odwołań można usunąć pole delegacji.