您的位置:首页 > 数据库

PL/SQL小技巧一个:在子类中怎么调用父类被重载的方法

2005-01-19 21:22 681 查看
在C++和Java中,这是非常容易实现的
C++是:父类名::被重载的方法(参数表), 比如:
ancestorclass::name({arguments});
而在Java中,可以用super代替父类,如这样实现
Super.name({arguments});

而在Oracle 9i Release2中都没实现这样的功能,
当然我们可以用其它办法来实现这样的功能。

父类对象类型
Create or Replace Type parent as object (
rowsID integer,
member procedure printAttr,
final member procedure printAttr_parent --最好加final,防止子类对此方法进行重载
)not final;
/

Create or replace Type body parent is
Member procedure printAttr is
Begin
printAttr_parent;
End;

final Member procedure printAttr_parent is
Begin
Super.printAttr; --此句是错地,会抛出identifier ‘super.printAttr’ must be declared. 因此要删除此句。
Dbms_output.put_line(‘父类方法,RowsID:=’||rowsID);
End;
End;
/

子类对象类型
Create or replace type child under parent (
Overriding member procedure printAttr
)not final;
/

Create or replace type body child is
Overriding member procedure printAttr is
Begin
Dbms_output.put_line(‘子类过程---调用父类过程之前’);
--在此处我们要用self.printAttr,因为printAttr不是直接在子类中定义的过程
Self.printAttr;
Dbms_output.put_line(‘子类过程---调用父类过程之后’);
End;
End;
/

然后我们进行测试一下:
Declare
vParent parent := parent(1);
vChild child := child(11);
begin
dbms_output.put_line(‘运行父类过程‘);
vParent.printAttr;
dbms_output.put_line(‘运行子类过程‘);
vChild.printAttr;
end;

运行结果:

运行父类过程
父类方法,RowsID:=1
运行子类过程
子类过程---调用父类过程之前
父类方法,RowsID:=11
子类过程---调用父类过程之后

虽说这有点儿麻烦,父类有几个被重载的方法,你就要在父类父加几个另外的方法。
但也是没办法的办法,’曲线救国’嘛。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐