Воссоединение SQL в 1995 г. люди, проекты, политика

       

Структурные определяемые пользователями типы


Наиболее фундаментальным средством SQL:1999, поддерживающим объектную ориентацию, являются структурные определяемые пользователями типы; слово "структурный" отличает это средство от индивидуальных типов (которые тоже являются "определяемыми пользователями" типами, но в SQL:1999 могут базироваться только на встроенных типах SQL и поэтому не могут иметь ассоциированных с ними структур).

Структурные типы имеют ряд характеристик, наиболее важными из которых являются следующие:

  • Они могут определяться с одним или более атрибутами, каждый из которых может иметь любой допустимый в SQL тип, включая такие встроенные типы как INTEGER, такие типы коллекции как ARRAY или любой структурный тип (вложенный настолько, насколько это желательно).
  • Все аспекты их поведения характеризуются методами, функциями и процедурами.
  • Их атрибуты инкапсулированы через генерируемые системой функции наблюдения и изменения (функции "get" и "set"), единственные, обеспечивающие доступ к соответствующим значениям. Однако эти генерируемые системой функции нельзя перегружать; все остальные функции и методы могут быть перегружены.
  • Сравнения их значений выполняются только через определяемые пользователями функции.
  • Они могут участвовать в иерархиях типов, в которых более специализированные типы (подтипы) имеют все атрибуты и используют все функции, ассоциированные с более обобщенными типами (супертипами), но могут иметь новые атрибуты и подпрограммы.
  • Посмотрим на пример определения структурного типа:

    CREATE TYPE emp_type UNDER person_type AS ( EMP_ID INTEGER, SALARY REAL ) INSTANIABLE NOT FINAL REF ( EMP_ID ) INSTANCE METHOD GIVE_RAISE ( ABS_OR_PCT BOOLEAN, AMOUNT REAL ) RETURNS REAL

    Этот новый тип является подтипом другого структурного типа, который можно было бы использовать для определения людей вообще, включая такие общие атрибуты как имя и адрес; новые атрибуты типа emp_type включают такие вещи, которые нехарактерны для "простых пожилых людей", такие как идентификатор служащего и размер заработной платы. Мы объявляем, что этот тип немедленно пригоден для прямого использования (instantiable) и ему разрешается иметь подтипы (NOT FINAL). Дополнительно к этому мы говорим, что любая ссылка на этот тип (см. ниже обсуждение REF-типов) порождаются из значений идентификаторов служащих. Наконец, мы определяем метод (подробнее об этом ниже), который может быть применен к экземплярам этого типа (его значениям).


    После интенсивного флирта с множественным наследованием (когда у подтипов допускается наличие более одного непосредственного супертипа) теперь в SQL:1999 обеспечивается модель типов, тесно соответствующая одиночному наследованию в языке Java. При определении типа разрешается указать либо, что тип является пригодным для немедленного использования (другими словами, что могут создаваться значения этого типа), либо, что тип непригоден для немедленного использования (аналогично абстрактным типам в других языках программирования). И естественно, в любом месте -- например, в столбце -- где допускается появление значения некоторого структурного типа, может появиться и значение любого из его подтипов; это обеспечивает в точности тот тип заменяемости, который свойственен объектно-ориентированным программам.

    Кстати, в некоторых объектно-ориентированных языках программирования, таких, как C++, при определении типа допускается спецификация степени инкапсуляции типа: уровень инкапсуляции атрибута PUBLIC означает, что любой пользователь этого типа может иметь доступ к атрибуту, PRIVATE означает, что к атрибуту может иметь доступ только тот программный код, который реализует методы типа, и PROTECTED означает, что к атрибуту могут иметь доступ только методы типа и методы любых его подтипов. В SQL:1999 этот механизм отсутствует, хотя предпринимались попытки его определить; мы ожидаем предложений по поводу этого механизма для будущего пересмотра стандарта.


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