類型繼承
not final子句指示可在定義另一對象類型時被繼承。
create type t_person as object (
id integer,
first_name varchar(10),
last_name varchar(10),
dob date,
phone varchar(12),
address t_address,
not final;
);
1.繼承屬性
create type t_business_person under t_person (
title varchar2(20),
company varchar2(20)
);
用子類型對象代替超類型對象
1.not substitutable對象
阻止子類型對象代替超類型對象
create table object_customers_not_subs of t_person
not substitutable at all levels;
其他有用的對象函數
1.IS OF()函數
檢查對象是否爲某種特定的類型或子類型。
select value(o)
from object_business_customer o
where value(o) is of (t_business_person);
2.TREAT()函數
在運行時檢查是否可將子類型的對象視爲超類型的對象,如果可以,返回一個對象,如果不可以返回null。
select nvl2(treat(value(o) as t_person).first_name, 'yes', 'no')
from object_customers o
where first_name = 'Jason';
NVL2(TREAT(VALUE(O)
---------------------
yes
3.sys_typeid函數
可以得到對象類型的id
select sys_typeid(value(o))
from object_business_customer o;
SYS_TYPEID(VALUE(O))
--------------------
02
not instantiable對象類型
防止創建該類型的對象實例。
create type t_vehicle as object (
id integer,
make varchar2(15),
model varchar2(20)
) not final not instantiable;
用戶自定的構造函數
例如:
create type t_person2 as object (
id integer,
first_name varchar(10),
last_name varchar(10),
dob date,
phone varchar(12),
constructor function t_person2 (
p_id integer,
p_first_name varchar(10),
p_last_name varchar(10),
)return self as result,
constructor function t_person2 (
p_id integer,
p_first_name varchar(10),
p_last_name varchar(10),
p_dob date
)return self as result
);
構造函數不包含構造函數的實際代碼定義,代碼定義在類型體中;
例如:
create type body t_person2 as
constructor function t_person2(
p_id integer,
p_first_name varchar2(10),
p_last_name varchar2(10)
) return self as result is
begin
self.id := p_id;
self.first_name := p_first_name;
self.last_name := p_last_name;
self.dob = sysdate;
self.phone := '555-45632';
return;
end;
constructor function t_person2(
p_id integer,
p_first_name varchar2(10),
p_last_name varchar2(10),
p_dob date;
) return self as result is
begin
self.id := p_id;
self.first_name := p_first_name;
self.last_name := p_last_name;
self.dob = p_dob;
self.phone := '555-45632';
return;
end;
end;
重載方法
當創建超類型的子類型時,可以用子類型中的方法重載超類型中的方法。
可以使用overriding關鍵字進行重載
例如:
create type t_person3 as object (
id integer,
first_name varchar(10),
last_name varchar(10),
member function display_details return varchar2
)not final;
create type body t_person3 as
member function display_details return varchar2 is
begin
return 'id=' || id || ',name=' ||first_name || ' '||last_name;
end;
end;
重載
create t_business_person3 under t_person3(
title varchar2(10),
company varchar2(10),
overriding member function display_details return varchar2
);
create type body t_business_person3 as
overriding member function display_details return varchar2 is
begin
return 'id=' || id || ',name=' ||first_name || ' '||last_name||'title='||title;
end;
end;
通用通用
從子類型中調用超類型的方法
例如:
return (self as t_person).display_details
self as完成的任務是將當前類型的對象視爲t_person類型的對象,然後調用父類的方法。