ZSBD-2st-1.2-w4.tresc-1.1-Slajd16
Polimorfizm i późne wiązanie
O obiektach składowanych w rozszerzeniach klas, które mają klasy pochodne mówi się, że są polimorficzne, bo mają różne cechy i metody. Na przykład wystąpienia klasy Figura mają określony atrybut „Typ ” służący do przechowywania informacji o typie figury oraz metodę „Powierzchnia ” służącą do wyznaczania powierzchni figur. Z kolei wystąpienia klasy pochodnej „Wielokąt ” oprócz odziedziczonego atrybutu „Typ ” mają dodatkowo wielowartościowy atrybut „Krawędzie ”. Odziedziczona po klasie „Figura ” metoda „Powierzchnia ” jest w klasie „Wielokąt ” redefiniowana ponieważ sposób wyznaczania powierzchni wielokątów jest inny niż uniwersalnych figur. Rozszerzenie klasy „Figura ” obejmuje zarówno obiekty klasy „Figura ”, jak również różniące się od nich obiekty, które są wystąpieniami klasy „Wielokąt ”.
Na poziomie składni języków obiektowych polimorfizm obiektów wyraża się w występowaniu zmiennych polimorficznych i podstawień polimorficznych. Przez zmienną polimorficzną rozumie się taką zmienną, pod którą są podstawiane obiekty, które są wystąpieniami różnych klas, ale które występują w relacji podtypu z typem zmiennej polimorficznej. W podanym przykładzie, zmienną polimorficzną jest zmienna „f ”. Mimo, że typem zmiennej „f ” jest klasa „Figura ”, to przypisywane są jej obiekty innych klas. Najpierw pod zmienną „f ” jest podstawiony obiekt typu „Koło ”, a później obiekt typu „Wielokąt ”. Następnie przez zmienną „f ” do przypisanych jej obiektów są przesyłane komunikaty o nazwie „Powierzchnia ”. Właściwy kod metody wyznaczania powierzchni jest ustalany dynamicznie na podstawie typu obiektu przypisanego w danym momencie zmiennej „f ”. W pokazanym przykładzie najpierw jest to kod metody „Powierzchnia ” zdefiniowanej w klasie „Koło ”, następnie kod metody „Powierzchnia ” klasy „Wielokąt ”.
Szczególnym przypadkiem zmiennych polimorficznych są nazwy rozszerzeń klas, które mają klasy pochodne. Nazwa rozszerzenia klasy bazowej pozwala przetwarzać obiekty należące do rozszerzeń wszystkich klas pochodnych.