ZSBD-2st-1.2-lab9.tresc-1.3-Slajd9
Polimorfizm
Jedną z własności modelu obiektowego i obiektowo-relacyjnego jest polimorfizm. Polega on na tym, że do zmiennej typu obiektowego można przypisać obiekt jej typu, bądź dowolnego podtypu. Przykładowo, do zmiennej typu FIGURA można przypisać obiekty typu FIGURA (o ile nie jest to typ abstrakcyjny), oraz obiekty dowolnego podtypu typu FIGURA, na przykład obiekty typu KWADRAT albo KOLO. Poprzez takie zmienne jednak mamy dostęp jedynie do atrybutów zadeklarowanych w typie FIGURA. Dostęp do atrybutów specyficznych dla podtypu nie jest możliwy w sposób bezpośredni. Przeanalizujmy przykład na slajdzie. Fragment programu na przykładzie (1) pokazuje deklarację zmiennych typów FIGURA, KWADRAT i KOLO, oraz utworzenie obiektów typów KWADRAT i KOLO. Przykład (2) pokazuje dopuszczalne przypisania: do zmiennej typu FIGURA można przypisać obiekty typu KWADRAT albo KOLO. W drugą stronę (3) takie przypisanie nie zawsze jest możliwe. Przykładowo, jeżeli próbujemy do zmiennej typu KWADRAT przypisać zawartość zmiennej typu FIGURA, to może się zdarzyć, że w zmiennej tej będzie się krył obiekt typu KWADRAT i wówczas takie przypisanie byłoby poprawne. Jednak może się tam kryć również obiekt typu KOLO i wówczas przypisanie nie jest możliwe. Aby rozwiązać ten problem stosuje się odpowiednią konstrukcję, która zostanie wprowadzona później. Przypisania dokonywane w sposób przedstawiony na (3), czyli bez użycia tej konstrukcji, nie są dopuszczalne i kończą się błędem. Przypisania pomiędzy zmiennymi typów nie znajdujących się na jednej ścieżce w hierarchii dziedziczenia nie są nigdy dozwolone (4).
Przykłady (1)(2)(3) i (4) pokazywały polimorficzne przypisania w języku PL/SQL, ale powyższa dyskusja odnosi się również do tabel składujących obiekty i języka SQL. Polecenie (5) tworzy tabelę obiektową typu FIGURA. Taką tabelę można traktować jako zbiór zmiennych typu FIGURA. Możliwe są zatem polimorficzne przypisania do tych „zmiennych” obiektów podtypów typu FIGURA. Demonstrują to polecenia INSERT (6), które wstawiają to tabeli FIGURY obiekty typów KWADRAT i KOLO. Jak wspominano wcześniej, poprzez zmienne nadtypu dostępne są jedynie atrybuty, które są zadeklarowane w nadtypie, natomiast wszelkie atrybuty charakterystyczne dla podtypów nie są dostępne w bezpośredni sposób. Odnosi się to również do zapytań do tabel składujących obiekty. Zapytanie (7) odczytuje wartość wszystkich dostępnych atrybutów z tabeli FIGURY. Jak łatwo zauważyć na wyniku zapytania, odczytany został jedynie KOLOR, który został zadeklarowany w typie FIGURA. Atrybuty DLUGOSC_BOKU i PROMIEN charakterystyczne dla typów odpowiednio KWADRAT i KOLO nie zostały odczytane.