Jest możliwe, aby zbudować ogólny sposób postępowania te sznurki, za pomocą dziedziczenia i polimorfizmu. Jeśli zamierzamy używać obiektów, powinniśmy wykorzystać możliwości programowania obiektowego.
Po pierwsze potrzebujemy obiektu głównego. Ten TYPE nie jest dostępny, co oznacza, że nie możemy faktycznie zadeklarować jego wystąpienia. Zauważ, że funkcja składowa TO_STRING() jest również zadeklarowana jako NIEZAPEWNIAJĄCA. Oznacza to, że każdy TYPE, który dziedziczy z STRINGABLE_TYPE, musi mieć własną implementację metody.
SQL> create or replace type stringable_type as object
2 (id number(7,0)
3 , NOT INSTANTIABLE member function to_string
4 return varchar2
5 )
6 not final not instantiable
7/
Type created.
SQL>
Oto jeden typ, który dziedziczy po STRINGABLE_TYPE. Słowo kluczowe OVERRIDING jest obowiązkowe, nawet jeśli dekla- racja typu nadrzędnego zmusza nas do jego implementacji.
SQL> create or replace type emp_type under stringable_type
2 (empno number(7,0)
3 , ename varchar2(20)
4 , sal number(7,2)
5 , OVERRIDING member function to_string
6 return varchar2
7 );
8/
Type created.
SQL> create or replace type body emp_type
2 is
3 OVERRIDING member function to_string
4 return varchar2
5 is
6 begin
7 return 'EMP>>'||self.id||'='||self.empno||'::'||self.ename||'::'||self.sal;
8 end;
9 end;
10/
Type body created.
SQL>
Oto kolejny typ ...
SQL> create or replace type dept_type under stringable_type
2 (deptno number(2,0)
3 , dname varchar2(30)
4 , OVERRIDING member function to_string
5 return varchar2
6 );
7/
Type created.
SQL> create or replace type body dept_type
2 is
3 OVERRIDING member function to_string
4 return varchar2
5 is
6 begin
7 return 'DEPT>>'||self.id||'='||self.deptno||'::'||self.dname;
8 end;
9 end;
10/
Type body created.
SQL>
Teraz możemy utworzyć funkcję, która przyjmuje typu rodzajowego i wywołuje metodę Generic:
SQL> create or replace function type_to_string
2 (p_obj in stringable_type)
3 return varchar2
4 is
5 begin
6 return p_obj.to_string();
7 end;
8/
Function created.
SQL>
Przez cudów polimorfizm możemy przekazać dwa różne obiekty do funkcji, która faktycznie wykona metodę nadpisującą:
SQL> set serveroutput on
SQL> declare
2 obj1 emp_type;
3 obj2 dept_type;
4 begin
5 obj1 := emp_type(1, 8000, 'VAN WIJK', 3500);
6 obj2 := dept_type(2, 20, 'COMMUNICATIONS');
7 dbms_output.put_line(type_to_string(obj1));
8 dbms_output.put_line(type_to_string(obj2));
9 end;
10/
EMP>>1=8000::VAN WIJK::3500
DEPT>>2=20::COMMUNICATIONS
PL/SQL procedure successfully completed.
SQL>
To dość dużo pracy, aby dojść do tego punktu. Byłoby fajnie, gdyby TYP Oracle'a miał co najmniej abstrakcyjną instrukcję TO_STRING(), którą moglibyśmy przesłonić. Ale to tylko jeden z wielu luźnych celów w implementacji obiektu 8-)
Wielki przykład dziedziczenia typów obiektów! –