9, జనవరి 2014, గురువారం

Overriding vs hiding in plsql



Hi Experts,
I am going through the oracle documentation to understand the concept of overriding and hiding. This is the definition from the oracle documentation

"Redefining an inherited method to customize its behavior in a subtype is called overriding, in the case of member methods, or hiding, in the case of static methods."
Link: http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjbas.htm

Could you please provide an example of hiding and how it differs from overridding?
"Redefining an inherited method to customize its behavior in a subtype is called overriding, in the case of member methods, or hiding, in the case of static methods."
Consider this base class:
create or replace type TParentClass as object(
  name varchar2(10),
  static function ClassName return varchar2,
  member function DoSomething return varchar2
) not final;
It defines a static class function and a member class function. Now both can be overridden in asubclass. E.g.

create or replace type TChildClass under TParentClass (
  static function ClassName return varchar2,   // hiding class static method
  overriding member function DoSomething return varchar2  // overriding class member method
) final;

Correction made - the clause overriding is not needed for static class methods, when the subclass defines a static method with the same name as the parent class static method (thus hiding the parent static method via the subclass)
. If both the class can be overriden, how the hiding differs from overriding. It would be great if you give me a complete example.When the overriding or hiding would be useful?
If both the class can be overriden, how the hiding differs from overriding. The static class method is not overridden (I fixed the example I posted above - was not close to an Oracle database over the weekend to confirm the syntax).
The static class method is redefined in the subclass - which means that one cannot call the parent static class method via the child class.It would be great if you give me a complete example.



A basic example below.
SQL> create or replace type TParentClass as object(
  2          name varchar2(10),
  3          static function ClassName return varchar2,
  4          member function DoSomething return varchar2
  5  ) not final;
  6  /

Type created.

SQL>
SQL> create or replace type body TParentClass as
  2          static function ClassName return varchar2 is
  3          begin
  4                  return( 'TParentClass' );
  5          end;
  6 
  7          member function DoSomething return varchar2 is
  8          begin
  9                  return( 'Hello world from '||TParentClass.ClassName );
 10          end;
 11  end;
 12  /

Type body created.

SQL>
SQL> create or replace type TChildClass under TParentClass (
  2          static function ClassName return varchar2,
  3          overriding member function DoSomething return varchar2
  4  ) final;
  5  /

Type created.

SQL>
SQL> create or replace type body TChildClass as
  2          static function ClassName return varchar2 is
  3          begin
  4                  return( 'TChildClass' );
  5          end;
  6 
  7          overriding member function DoSomething return varchar2 is
  8          begin
  9                  return( 'Hello world from '||TChildClass.ClassName );
 10          end;
 11  end;
 12  /

Type body created.

SQL>
SQL> declare
  2          obj     TParentClass;
  3  begin
  4          --// create a parent class object
  5          obj := new TParentClass(null);
  6          DBMS_OUTPUT.put_line( 'obj method DoSomething()  = '||obj.DoSomething() );
  7  end;
  8  /
obj method DoSomething()  = Hello world from TParentClass

PL/SQL procedure successfully completed.

SQL>
SQL> declare
  2          obj     TParentClass;
  3  begin
  4          --// create a child object
  5          obj := new TChildClass(null);
  6          DBMS_OUTPUT.put_line( 'obj method DoSomething() = '||obj.DoSomething() );
  7          --// use "general invocation" to call the overridden parent method
  8          DBMS_OUTPUT.put_line( 'parent method DoSomething() = '||(obj as TParentClass).DoSomething() );
  9  end;
 10  /
obj method DoSomething() = Hello world from TChildClass
parent method DoSomething() = Hello world from TParentClass

PL/SQL procedure successfully completed.

SQL>
SQL> begin
  2          --// not possible to call a hidden parent static class method via
  3          --// the child class
  4          DBMS_OUTPUT.put_line( 'class = '||(TChildClass as TParentClass).ClassName() );
  5  end;
  6  /
        DBMS_OUTPUT.put_line( 'class = '||(TChildClass as TParentClass).ClassName() );
                                           *
ERROR at line 4:
ORA-06550: line 4, column 37:
PLS-00306: wrong number or types of arguments in call to 'TCHILDCLASS'
ORA-06550: line 4, column 2:
PL/SQL: Statement ignored
When the overriding or hiding would be useful?
Hiding the static method as shown above allows the child class to hide the parent's static class method and implement its own static method. The simplistic example above would not work correctly if the child static method showed the name of the parent class. So the child class has to hide the parent static class method and provide its own class method instead.

Normal class methods can be overridden - normal o-o behaviour. The child class provides a different or extended features using the same member method as the parent class. However, the parent method is not hidden. It can still be accessed - and in PL/SQL, it is accessed via a feature called "+generalised invocation/expressions+" as detailed in Oracle® Database Object-Relational Developer's Guide.

కామెంట్‌లు లేవు:

కామెంట్‌ను పోస్ట్ చేయండి