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

发表于:2007-07-02来源:作者:点击数: 标签:
在C++和Java中,这是非常容易实现的 C++是:父类名::被重载的方法(参数表), 比如: ancestorclass::name({arguments}); 而在Java中,可以用super代替父类,如这样实现 Super.name({arguments}); 而在Oracle 9i Release2中都没实现这样的功能, 当然我们可以

在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
子类过程---调用父类过程之后


虽说这有点儿麻烦,父类有几个被重载的方法,你就要在父类父加几个另外的方法。
但也是没办法的办法,’曲线救国’嘛。

原文转自:http://www.ltesting.net