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


           

SQL нет синтаксической конструкции, для


Таким образом, выясняется, что в 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.


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





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий