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



             

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


Таким образом, выясняется, что в PL/SQL нет синтаксической конструкции, для того чтобы сослаться на метод типа-предка.

В объектно-ориентированных языках для этого существуют специальные языковые конструкции. В Java это ключевое слово super (супер-класс), в Object Pascal - Inherited. Данный механизм обеспечивает доступ к унаследованной логике и устраняет избыточность кода. Документация по языку PL/SQL (Oracle10g Rel.1 PL/SQL User's Guide and Reference, Oracle10g Rel.1 Application Developer's Guide - Object-Relational Features) хранит по этому поводу молчание.

Для решения этой проблемы предлагается следующий алгоритм:

  • Создается экземпляр типа-предка
  • Затем копируется в него содержимое полей текущего экземпляра
  • Происходит вызов нужного метода экземпляра типа-предка
  • Поля экземпляра типа-предка копируются в текущий экземпляра.

Модифицируем исходный текст для реализации этого подхода, добавив в родительский тип копирующий конструктор:

------------------------------------------------------------ --спецификация объектного типа t_ParentType, - --добавлен копирующий конструктор - ------------------------------------------------------------ create or replace type t_ParentType as object ( v_Field1 varchar2(32), --копирующий конструктор: constructor function t_ParentType(v_pObject in out nocopy t_ParentType) return self as result, member function getName(self in out nocopy t_ParentType) return varchar2 ) not final; ------------------------------------------------------------ --тело объектного типа t_ParentType - ------------------------------------------------------------ create or replace type body t_ParentType is constructor function t_ParentType(v_pObject in out nocopy t_ParentType) return self as result is begin self.v_Field1 := v_pObject.v_Field1; return; end; member function getName(self in out nocopy t_ParentType) return varchar2 is begin return self.v_Field1; end; end;

В типе-потомке нам также будет необходим метод присваивания, который будет копировать все поля переменной экземпляра типа в текущий экземпляр, - назовем его assign. Далее добавим функцию inherited_getName, которая будет реализовывать алгоритм вызова функции getName родительского типа t_ParentType. Фактически метод inherited_getName представляет собой оболочку для метода getName типа-предка t_ParentType.




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