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

         

Наследование


Наследование типов (Type inheritance) – это фундаментальная концепция в любой объектно-ориентированной системе. Наследование типов позволяет совместно использовать похожие свойства различных типов, а также расширять их характеристики.

Во многих объектно-ориентированных приложениях объекты организованы в типы, а типы – в иерархии типов. Эмпирически вполне достаточно организовать иерархии типов в виде набора деревьев. Тем самым, простого наследования достаточно для поддержки организации типов в большинстве приложений. Java – это объектно-ориентированный язык программирования, поддерживающий простое наследование. С помощью простого наследования тип может расширять один супертип (наследовать от одного супертипа). Такой тип, называемый подтипом (subtype), наследует все атрибуты и методы своего супертипа (supertype). Подтипу можно также добавлять новые атрибуты и методы или переопределять унаследованные методы. СУБД Oracle поддерживает модель простого наследования. А это очень близко соответствует стандарту ANSI SQL:99. (Прим. ред. Этот стандарт ANSI принят одновременно с официальным международным стандартом ISO/IEC SQL:1999 и тождественен ему.) В следующих нескольких разделах поддержка наследования типов в Oracle обсуждается более подробно.

Иерархия типов

Корневой тип иерархии создается с помощью оператора CREATE TYPE, в котором должен быть указано ключевое слово NOT FINAL (нетерминальный).

CREATE TYPE Person_t AS OBJECT( name VARCHAR2(100), dob DATE, MEMBER FUNCTION age() RETURN number, MEMBER FUNCTION print() RETURN varchar2) NOT FINAL;

Под нетерминальным типом может быть создан подтип. Он наследует все атрибуты и методы от своего супертипа. В нем можно добавить новые атрибуты и методы и/или переопределить унаследованные методы.

CREATE TYPE Employee_t UNDER Person_t( salary NUMBER, bonus NUMBER, MEMBER FUNCTION wages() RETURN number, OVERRIDING MEMBER FUNCTION print() RETURN varchar2);

В Oracle Common Schema имеется более сложный пример иерархии наследования типов. Как показано на рис. 1, класс Category и его подклассы моделируются элегантной, но простой конструкцией, представляющей иерархии "часть-целое" (part-whole) с древовидной структурой. Этот пример более детально раскрывает основные преимущества системы объектных типов Oracle9i при сохранении всех аспектов объектной модели приложения.


create type category_typ as object ( category_name varchar2(50) , category_description varchar2(1000) , category_id number(2) ) NOT INSTANTIABLE NOT FINAL; create type subcategory_ref_list_typ as table of ref category_typ; create type product_ref_list_typ as table of number(6); / create type corporate_customer_typ under customer_typ ( account_mgr_id number(6) ); create type leaf_category_typ under category_typ ( product_ref_list product_ref_list_typ ); create type composite_category_typ under category_typ ( subcategory_ref_list subcategory_ref_list_typ ) NOT FINAL; create type catalog_typ under composite_category_typ ( member function getCatalogName return varchar2 );

Иерархия представлений

Объектное представление может быть создано как подпредставление другого объектного представления, создавая тем самым иерархию представлений. Преимущества иерархии представлений вытекают из того факта, что строки иерархии объектных представлений включают все строки их подпредставлений. Благодаря этому свойству, можно запрашивать объекты типов, принадлежащих к некоторой иерархии, осмысленным образом.

CREATE VIEW Persons OF Person_t WITH OBJECT ID (name) AS SELECT name, dob FROM r_persons; CREATE VIEW Employees OF Employee_t UNDER Persons AS SELECT name, dob, salary, bonus from r_employees;

Запрос к представлению Persons выберет всех лиц, включая служащих.

SELECT VALUE(p) FROM Persons p;

Oracle предоставляет возможность выполнения новых операторов для определения наиболее специализированного типа (most-specific-type) некоторого экземпляра объекта и преобразования объекта супертипа Т в объект подтипа T (если это возможно).

(Прим. ред. Связь "тип-подтип" в объектных моделях данных позволяет моделировать иерархию двойственных видов абстракций типов сущностей предметной области – абстракции обобщения (generalization) и специализации (specialization). При этом супертип является обобщением своего подтипа, а подтип – специализацией супертипа. Естественно назвать подтип нижнего уровня иерархии "наиболее специализированным типом" или "самым специализированным типом". Важно заметить, что это свойство является относительным – оно имеет место относительно заданной иерархии типов.)

Например, следующий запрос выбирает всех персон с заданной датой рождения (date of birth, dob), которые являются служащими.



SELECT TREAT(VALUE(p) AS Employee_t) FROM Persons p WHERE dob = '01-01-1970' AND VALUE(p) IS OF(Employee_t);

Некоторые другие свойства иерархии представлений:

  • тип суперпредставления должен быть непосредственным супертипом для типа создаваемого объектного представления;
  • подпредставление наследует объектный идентификатор OID от своего суперпредставления.


  • Свойство подстановочности

    Одно из наиболее значительных преимуществ наследования – это подстановочность (substitutability). Подстановочность – это основная характеристика полиформизма типов (type polymorphism), которая позволяет использовать значение некоторого подтипа там, где ожидается значение супертипа (например, параметры метода), причем в этом случае не требуется предварительных конкретных знаний о подтипе. (Прим. ред. Более подробно о подстановочности см. например [4].). В этой статье, к сожалению, уже нельзя исправить термин "подставляемость" на общеупотребительный термин "подстановочность".)

    Подстановочность экземпляра (Instance substitutability) – это возможность использования значения некоторого объекта подтипа в контексте, объявленном в терминах супертипа. Подстановочность ссылки REF – это возможность использовать ссылку REF на подтип в контексте, объявленном в терминах ссылки на супертип. По умолчанию, объектные столбцы и объектные таблицы обладают свойством подстановочности. Базовая модель хранения – это единая плоская таблица со столбцами, которые соответствуют всем атрибутам всех возможных подтипов. В столбце идентификатора типа (type id column) хранится информация о наиболее специализированном типе данного типа.

    CREATE TABLE dept (id NUMBER, mgr Person_t); INSERT INTO dept VALUES(1, Employee_t(…));

    Динамическая диспетчеризация методов (Dynamic Method Dispatch)

    Метод – это процедура или функция, которая является частью определения объектного типа. Методы могут выполняться в среде исполнения Oracle9i или передаваться для выполнения в другую среду. Методы могут быть реализованы с применением ряда языков, в том числе – PL/SQL, C/C++ и Java.

    Подтип может переопределять любой из нетерминальных методов экземпляра (non-final member methods), определенных для его супертипа, и предоставлять другую реализацию. Когда вызывается метод некоторого экземпляра объекта, осуществляется диспетчеризация метода и вызов конкретной реализации в зависимости от наиболее специализированного типа данного экземпляра. СУБД Oracle поддерживает возможность мультиязыковой динамической диспетчеризации методов. Когда на некотором экземпляре объекта вызывается метод, осуществляется его диспетчеризация и вызов конкретной его реализации, основанной на наиболее специализированном типе данного экземпляра.


    Содержание раздела