类型继承
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类型的对象,然后调用父类的方法。