Базы данных Oracle - статьи



              

Вызов переопределенного метода в типе-потомке - часть 3


------------------------------------------------------------ --Спецификация объектного типа t_ChildType, - --который является наследником : t_ParentType - --Добавлен метод присваивания - assign - ------------------------------------------------------------ create or replace type t_ChildType under t_ParentType ( v_Field2 varchar2(64), constructor function t_ChildType(v_pField1 varchar2, v_pField2 varchar2) return self as result, --метод для вызова унаследованного метода getName: member function inherited_getName(self in out nocopy t_ChildType) return varchar2, --метод присваивания: member procedure assign(self in out nocopy t_ChildType, v_pObject in out nocopy t_ChildType),

overriding member function getName(self in out nocopy t_ChildType) return varchar2 ) not final; ------------------------------------------------------------ --Тело объектного типа t_ChildType - ------------------------------------------------------------ create or replace type body t_ChildType is constructor function t_ChildType(v_pField1 varchar2, v_pField2 varchar2) return self as result is begin self.v_Field1 := v_pField1; self.v_Field2 := v_pField2; return; end; member function inherited_getName(self in out nocopy t_ChildType) return varchar2 is v_xInheritedObject t_ParentType; --экземпляр объекта-предка v_xRes varchar2(32); begin -- создаем экземпляр предка с помощью копирующего конструктора v_xInheritedObject := new t_ParentType(self); -- вызываем метод getName класса-предка v_xRes := v_xInheritedObject.getName; -- в общем случае вызов метода предка мог изменить поля self.assign(v_xInheritedObject); -- поэтому необходимо обратно скопировать их в текущий объект (self) return v_xRes; end; ---------------------------------------------------------- -- метод присваивания: - -- просто копируем все поля-объекта источника в текущий - -- экземпляр (self) - ---------------------------------------------------------- member procedure assign(v_pObject in out nocopy t_ChildType) is begin self.v_Field1 := v_pObject.v_Field1; self.v_Field2 := v_pObject.v_Field2; end; ---------------------------------------------------------- -- переопределенный метод getName: - -- через вызов inherited_getName происходит обращение к - -- унаследованному методу getName - ---------------------------------------------------------- overriding member function getName(self in out nocopy t_ChildType) return varchar2 is begin return inherited_getName '-' v_Field2; end; end;

В заключение, можно заметить, что данная методика применима для иерархий типов произвольного числа уровней. Если же необходимо обеспечить вызов переопределенного метода из произвольного родительского класса, то нужно иметь уникальные имена для методов-оболочек.

Например: в следующей иерархии классов: t_ParentType -> t_ChildType -> t_SubChildType для вызова метода произвольного типа-предка можно использовать следующие правило: к имени метода добавляется цифра - номер уровня в иерархии. В этом случае имена методов-оболочек соответственно будут выглядеть следующим образом:

getName0->getName1->getName2

Вышеописанная методика демонстрируется в данном примере .




Содержание  Назад  Вперед