在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 子类过程---调用父类过程之后
虽说这有点儿麻烦,父类有几个被重载的方法,你就要在父类父加几个另外的方法。 但也是没办法的办法,’曲线救国’嘛。

|