Did you know we have that since 11g? The generalized invocation allows a subtype to invoke a method of a parent type (supertype) using the following syntax:
(SELF AS supertype_name).method_name
Check the example below to understand it. First, creating original type:
CREATE OR REPLACE TYPE type_test AS OBJECT (MEMBER FUNCTION return_text RETURN VARCHAR2) NOT FINAL; / CREATE OR REPLACE TYPE BODY type_test AS MEMBER FUNCTION return_text RETURN VARCHAR2 IS BEGIN RETURN 'This is the original text.'; END; END; /
And now creating a subtype of this object, which adds a new attribute and method as well as overriding the member’s function.
CREATE OR REPLACE TYPE subtype_test UNDER type_test (OVERRIDING MEMBER FUNCTION return_text RETURN VARCHAR2); / CREATE OR REPLACE TYPE BODY subtype_test AS OVERRIDING MEMBER FUNCTION return_text RETURN VARCHAR2 IS BEGIN RETURN (self AS type_test).return_text || ' This is an additional subtype text.'; END; END; /
And when calling:
SET SERVEROUTPUT ON DECLARE my_subtype subtype_test; BEGIN DBMS_OUTPUT.put_line(my_subtype.show_attributes); END; / This is the original text. This is an additional subtype text.
A type can invoke the member functions of any parent type in this way, regardless of the depth of the inheritance.
Pretty nice, right?
Cheers!