Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объекты в ORACLE.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
143.87 Кб
Скачать

3. Реализация механизма наследования объектов в oracle

3.1. Особенности наследования объектов в oracle

Реализация механизма наследования в СУБД ORACLE имеет свои особенности по сравнению с такими языками высокого уровня как, например, Delphi (Object Pascal) или C++. Отличия, в частности, заключаются в следующем:

  • нет корневого типа, от которого наследуются все остальные объекты (как TObject в Delphi);

  • нет множественного наследования, только простое (наследование от одного предка).

Терминология механизма наследования, реализованного в СУБД ORACLE, также несколько отличается от более привычной терминологии для тех, кто программирует на языках высокого уровня (см. таблицу).

Таблица 1. Разница в терминологии объектного подхода в ООП и СУБД ORACLE

Термин в ООП

Термин в СУБД ORACLE

Класс

Объект

Экземпляр класса

Экземпляр объекта

Родительский класс

Супертип

Класс-потомок

Подтип

Для того чтобы указать, что новый объект должен унаследовать все свойства и методы супертипа (родительского объекта), используют следующую конструкцию:

CREATE OR REPLACE TYPE имя_подтипа UNDER имя_супертипа(

);

По умолчанию типы в ORACLE не могут быть унаследованы. Для того чтобы тип мог быть в последствии унаследован другим, в объявлении этого типа должен быть указан параметр NOT FINAL (такие типы называются нетерминальными):

CREATE OR REPLACE TYPE имя_типа IS OBJECT(

)

NOT FINAL;

3.2. Абстрактные объекты

Абстрактные объекты – это объекты, экземпляры которых нельзя создать (по аналогии с абстрактными классами в ООП). Такие объекты создаются для того, чтобы в последствии выступить в качестве супертипов в наследовании.

Для того чтобы сделать объект абстрактным, в его объявление надо добавить параметр NOT INSTANTIABLE. Указание параметра NOT FINAL в этом случае является обычным, так как мало практического смысла в том, чтобы создавать абстрактный объект, который нельзя унаследовать.

Пример:

Допустим, есть иерархия объектов (см. рис. 1):

Рис. 1. Иерархия объектов

DROP TYPE sales_manager_typ;

DROP TYPE boss_typ;

DROP TYPE employee_typ;

DROP TYPE department_typ;

-- создадим объект department_typ для хранения информации об отделе:

CREATE OR REPLACE TYPE department_typ IS OBJECT(

Dep_Id NUMBER,

Caption varchar2(50)

);

/

-- создадим абстрактный объект employee_typ, обладающий основным набором свойств,

-- а также метод, определяющий количество отработанных работником дней:

CREATE OR REPLACE TYPE employee_typ IS OBJECT(

Name VARCHAR2(30),

Hire_Day DATE,

MEMBER FUNCTION DaysAtCompany RETURN NUMBER

)

NOT INSTANTIABLE

NOT FINAL;

/

CREATE OR REPLACE TYPE BODY employee_typ IS

MEMBER FUNCTION DaysAtCompany RETURN NUMBER IS

BEGIN

RETURN TRUNC(sysdate-Hire_Day);

END;

END;

/

-- создадим объект boss_typ, наследующий все свойства и методы объекта

-- employee_typ (для простоты примера данный объект не будет иметь собственных

-- свойств и методов):

CREATE OR REPLACE TYPE boss_typ UNDER employee_typ();

/

-- создадим объект sales_manager_typ, наследующий все свойства и методы объекта

-- employee_typ и имеющий дополнительное свойство, обозначающее принадлежность к

-- отделу:

CREATE OR REPLACE TYPE sales_manager_typ UNDER employee_typ(

Dep department_typ

);

/

Примечание: данные о взаимозависимостях типов можно посмотреть в таблице USER_TYPES:

SELECT supertype_name, type_name

FROM user_types

ORDER BY 1, 2;