
- •Введение
- •1. Достоинства и недостатки реляционной и объектной моделей Задачи, недоступные для реляционного подхода
- •Задачи, недоступные для объектного подхода
- •Задачи, недоступные обеим моделям
- •2. Реализация объектного подхода в oracle
- •2.1. Хранение объектов в столбцах реляционных таблиц
- •2.2. Создание таблицы объектов
- •2.3. Ссылки на объект
- •2.4. Методы объектов
- •2.5. Конструкторы
- •2.6. Статические методы
- •2.7. Методы сравнения
- •2.8. Объектные представления
- •3. Реализация механизма наследования объектов в oracle
- •3.1. Особенности наследования объектов в oracle
- •3.2. Абстрактные объекты
- •4. Реализация полиморфизма в субд oracle
- •4.1. Полиморфизм типов
- •4.2. Расширение и сужение объектных типов
- •4.3. Оператор is of
- •4.4. Виртуальные методы
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;