|
Программирование >> Хронологические базы данных
set - установить ), для которых используется синтаксис уточнения с помощью точки. Пусть, например, Z, Р и LS- SQL-переменные типов FLOAT, POINT и LINESEG соответственно. Тогда допустимы следующие выражения. Р.Х /* Получить значение компонента X точки Р */ LS.BEGIN.X /* Получить значение компонента X */ /* точки BEGIN сегмента линии LS */ SET Р.Х = z ; /* Установить значение z для */ /* компонента X точки Р */ SET LS.BEGIN.X = z ; /* Установить значение z для */ /* компонента X точки BEGIN */ /* сегмента линии LS */ 4. Поскольку какие-либо дополнительные операторы не были определены, из других операторов для этих типов допустимы лишь операторы сравнения на равенство и операторы присвоения, которые допустимы для всякого типа. В частности, отметим, что операторы-селекторы типов POINT и LINESEG (в смьюле главы 5) не определяются автоматически, поэтому нет и литералов типов POINT и LINESEG. 5. Уточнение FINAL означает, что любая попытка определить другой тип как собственный подтип любого из этих типов приведет к ошибке (см. раздел Б.З). Иначе говоря, оба эти типа - листовые и будут такими оставаться всегда. 6. Являются ли типы POINT и LINESEG (или структурированные типы вообще) инкапсулированными ? К сожалению, ответ на этот вопрос зависит от контекста. Например, если структурированный тип используется как тип некоторого столбца, ответ будет Да (пожалуй). Однако, если он используется как тип некоторой таблицы (см. раздел Б.4), конечно, ответ будет Нет . Замечание. В первом случае добавление пожалуй означает, что даже в этой ситуации операторы получить ( get ) и установить ( set ), по существу, предоставляют атрибуты данного типа (как уже указывалось) и не могут быть замещены. Возможно, для первого случая уместно использовать термин псевдоинкапсулированные типы или псевдоскаляры. Приведем общий синтаксис для определения структурированного типа, который не является каким-либо подтипом (см. раздел Б.З, где рассматривается случай определения подтипов). CREATE TYPE <имя типа> AS ( <список определений атрибутов> ) [ <реализация ссылочного типа> ] [ [ NOT ] INSTANTIABLE ] [ NOT ] FINAL [ <список спецификаций методов> ] ; Следует отметить, что этот мутатор не является настоящим мутатором в смысле главы 5, т.е. типичным оператором обновления, поскольку по определению он возвращает значение. Обсуждение последствий (неприятных) этого факта, к сожалению, выходит за рамки данного короткого приложения. (См. [3.3], где этот вопрос обсуждается подробно.) Пояснения 1. Параметр <список определений атрибутов> не должен быть пустым. 2. Необязательный параметр <реализация ссылочного типа> подробно обсуждается в разделе Б.4. 3. Уточнение NOT INSTANTIABLE означает, что тип является фиктивным типом в смысле главы 19. По умолчанию заданным считается уточнение INSTANTIABLE. 4. Уточнение NOT FINAL означает, что тип может иметь собственные подтипы; в противном случае используется уточнение FINAL. 5. К значениям и переменным данного структурированного типа Т применяются следующие операторы. а) Наблюдатели и мутаторы атрибутов, уже описанные выще. б) Операторы присвоения = и, возможно, сравнения < (оба оператора определяются с помощью отдельного оператора CREATE ORDERING FOR Т, хотя зачем требуется упорядочение, если нужно просто определить оператор присвоения = , не совсем понятно). в) Процедуры и функции, которые определяются, чтобы получить параметр типа Т (или любой из его собственных подтипов; см. раздел Б.З). г) Методы, которые определяются, чтобы получить специальный целевой параметр типа Гили любой из его собственных подтипов (опять же, см. раздел Б.З). Замечание. Здесь под методами подразумеваются методы в традиционном объектном смысле (см. главу 24), т.е. они являются операторами, которые рассматривают один параметр как специальный. Если метод М определен для типа Т и X- выражение типа Т, то специальный синтаксис точечного уточнения Х,М используется для вызова метода М для объекта X. (Здесь для простоты подразумевается, что метод М никаких других параметров не имеет.) В параметре <спецификация метода> задаются определения сигнатур метода в смысле глав 19 и 24. Однако они также включают многое другое, что относится к реализации и, по мнению автора, здесь неуместно. Реальный код, реализующий методы, определяется в другом месте. Б.З. Наследование типов в языке SQL3 поддержка наследования типов не полностью ортогональна, поскольку применяется только к структурированным типам, т.е. не поддерживается наследование типов для типов встроенных, генерируемых и типов DISTINCT. Кроме того, совсем не поддерживается множественное наследование типов. В этом разделе будет рассмотрено только наследование для псевдоскалярных структурированных типов, которое может считаться реализованным более или менее удовлетворительно. Обсуждение наследования неинкапсулированных структурированных типов откладывается до раздела Б.5. За исключением, может быть, строчных типов. Однако существуют некоторые проблемы, связанные с наследованием строчных типов, которые здесь не освещаются, поскольку это выходит за рамки данного приложения. Перечислим самые существенные различия между моделью наследования типов, которая была представлена в главе 19, и наследованием псевдоскалярных типов в языке SQL3. В языке SQL3 поддерживаются структурное наследование, а также наследование поведения. В языке SQL3 неверно различаются значения и переменные, и поэтому, в частности, не различаются заменимость значений и заменимость переменных. В языке SQL3 нет поддержки ограничений типа, и поэтому также нет поддержки специализации посредством ограничения. В языке SQL3 требуется, чтобы операторы обновления ( мутаторы ) наследовались безусловно. Вследствие этих различий в языке SQL3 допускаются некруглые окружности и другие несуразности, которые обсуждались в главе 19. Кроме того, некоторые операции сравнения в языке SQI.3 в результате дают значение ложь, когда они должны бы давать значение истина (поскольку, например, значение менее конкретного типа ELLIPSE может иметь равные полуоси и, значит, соответствовать окружности в обычном понимании). Ниже приводятся примеры описания типов эллипсов и окружностей на языке SQL3. CREATE ТУРЕ ELLIPSE AS ( А LENGTH, В LENGTH, CTR POINT ) NOT FINAL ; CREATE TYPE CIRCLE UNDER ELLIPSE AS ( R LENGTH ) - нереалистично! (см. ниже) NOT FINAL ; Однако отметим, что в этих определениях физической реализации типа CIRCLE используются четыре компонента- А, В и CTR (наследуемые от типа ELLIPSE) и R (указываемый только для типа CIRCLE). Для любой данной окружности, конечно, три из этих компонентов будут иметь одинаковые значения. В качестве альтернативы вместо атрибута R можно определить метод R для типа CIRCLE. Тогда тип CIRCLE будет иметь ту же физическую реализацию, что и тип ELLIPSE, и эта реализация будет менее избыточна. С другой стороны, если С- переменная объявленного типа CIRCLE, присвоение C.R будет допустимо в первом из этих проектов, но не допустимо во втором. И опять же, присвоение C.R, если оно поддерживается, будет, вообще говоря, давать такую окружность , что C.R Ф С.А! Ниже перечислены некоторые особенности в различии между моделью наследования типов, описанной в главе 19, и наследованием, которое поддерживается в языке SQL3. В языке SQL3 используется термин direct в понятии direct subtype для обозначения прямого непосредственного подтипа вместо более соответствующего случаю термина immediate . В языке SQL3 вместо термина корневой тип используется термин максимальный супертип . В языке SQL3 поддерживается оператор TREAT (аналог оператора TREAT DOWN). Например, в этом языке аналогом выражения TREAT DOWN AS CIRCLE(E) будет выражение TREAT Е AS CIRCLE.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |