Zpo-10-wyk-Slajd21
Replace Inheritance with Delegation
Kolejne przekształcenie pełni bardzo istotną rolę nie tylko jako metoda refaktoryzacji, ale również poznawczą: pokazuje, że w rzeczywistości dziedziczenie i delegacja są sobie równoważne na poziomie fizycznych struktur danych, różnią się jedynie sposobem implementacji relacji. Pamiętamy jednak z pierwszego wykładu, że stosowanie delegacji zamiast dziedziczenia przyczynia się do większej elastyczności systemu i jego otwartości na zmiany.
Przekształcenie to służy do zmiany dziedziczenia w relację delegacji. Klasa, która dotychczas była podklasą, po przekształceniu staje się obiektem delegującym wybrane odwołania do swojej dawnej nadklasy, a wywołania poprzedzone kwalifikatorem nadklasy (w Javie jest to słowo super ) zostaną zastąpione wyrażoną jawnie referencją.
Pierwszym krokiem przekształcenia jest wprowadzenie do podklasy pola o typie nadklasy i przypisanie mu wartości this . Powoduje to utworzenie jawnej referencji do nadklasy; jawnej, ponieważ relacja dziedziczenia wprowadza zawsze inną, niejawną relację pomiędzy podklasą a nadklasą. W rzeczywistości zatem istnieją w tym momencie dwie relacje łączące te same obiekty.
Ta sytuacja pozwala na stopniowe zmienianie odwołań do nadklasy przez referencję niejawną (czyli oznaczaną słowem this lub pomijaną) na odwołania przez referencję jawną. W tej fazie zapewniona jest możliwość odwrócenia przekształcenia i powrotu do stanu wyjściowego.
Po aktualizacji wszystkich odwołań można usunąć relację dziedziczenia, co powoduje konieczność wykonania ostatniego kroku przekształcenia: zaimplementowania prostych metod delegujących z "podklasy" do "nadklasy" w miejsce dawnych metod odziedziczonych.