Скачиваний:
82
Добавлен:
02.05.2014
Размер:
2.28 Mб
Скачать

19.5. Специализация по ограничениям

Рассмотрим следующий пример вызова оператора выбора для типа ELLIPSE. ELLIPSE ( LENGTH ( 5.0 ), LENGTH ( 5.0 ), POINT (...))

Это выражение возвращает эллипс с одинаковыми полуосями. Однако эллипс с оди- наковыми полуосями фактически является окружностью. Следует ли из этого, что данное выражение возвращает результат конкретного типа CIRCLE, а не ELLIPSE?

Вопросы, подобные приведенному выше, вызывали (и продолжают вызывать) в лите- ратуре довольно бурные дискуссии. В нашей модели мы решили (после долгих разду- мий), что лучше настаивать на том, чтобы выражение действительно возвращало резуль- тат конкретного типа CIRCLE. В общем виде это можно сформулировать так: если тип Т' является подтипом типа Т, а в результате вызова оператора выбора для типа Т возвраща- ется значение, которое удовлетворяет ограничениям типа для типа Т', то (в нашей моде- ли) результат вызова оператора выбора будет иметь тип Т'2.

Замечание. Предупредим, что лишь немногие существующие в настоящее время коммерческие реализации, если таковые вообще имеются, реально работают указанным образом, но мы считаем это просто одним из недостатков существующих систем. В [3.3] показано, к каким результатам приводит отсутствие подобной функциональности — та- кие системы вынуждены поддерживать "некруглые окружности", "неквадратные квадра- ты" и другие нелепости, чего не скажешь в случае нашего подхода.

Из вышесказанного следует (по крайней мере, в нашей модели), что нет значений конкретного типа ELLIPSE, для которых бы выполнялось равенство а = Ь. Иначе говоря, значения конкретного типа ELLIPSE относятся только к настоящим эллипсам, которые не являются окружностями. В других же моделях наследования, напротив, значения кон- кретного типа ELLIPSE соответствуют эллипсам, которые могут быть или не быть ок- ружностями. Мы считаем нашу модель более приемлемой в качестве "реальной модели".

Идея, согласно которой, например, эллипс с полуосями а = b должен относиться к типу CIRCLE, называют специализацией по ограничениям [3.3], хотя следует предупре- дить, что некоторые авторы подразумевают под этим понятием совсем иное (см., например, [19.7] и [19.11]).

Пересмотр оператора ТНЕ_псевдопеременная

Напомним, что в главе 5 оператор ТШ_псевдопеременная использовался для обнов- ления одного компонента переменной, оставляя при этом остальные компоненты неиз- менными (здесь "компоненты"— это, конечно, компоненты некоторого возможного представления, а не обязательно реального представления). Пусть, например, переменная Е имеет объявленный тип ELLIPSE, и пусть текущим значением переменной Е будет эл- липс с полуосями а = 5 и Ь = 3. Тогда в результате выполнения приведенного ниже оператора присвоения значение длины оси b переменной Е изменится, а длина оси а и положение центра останутся прежними.

ТНЕ_В { Е ) ;= LENGTH ( 4.0 ) ;

Как отмечалось в разделе 8.2 главы 8, операторы 1ШЕ_псевдопеременная не являются логически необходимыми— фактически это просто удобные сокращения. Например, предыдущая команда присвоения с оператором ТНЕ_В— это сокращенная запись для следующего оператора присвоения3.

Е := ELLIPSE ( ТНЕ_А ( Е ), LENGTH { 4.0 ), THE_CTR ( Е ) ) ;

Итак, рассмотрим приведенную ниже операцию присвоения. ТНЕ_В ( Е ) := LENGTH ( 5.0 ) ;

По определению это присвоение эквивалентно следующему оператору. Е := ELLIPSE ( ТНЕ_А ( Е ), LENGTH { 5.0 ), THE_CTR ( Е ) ) j

Следовательно, здесь должна вступить в силу специализация по ограничениям (поскольку выражение в правой части операции присвоения возвращает эллипс с полу- осями а = Ь). В результате после выполнения присвоения тип MST(E) должен быть CIRCLE, а не ELLIPSE.

Рассмотрим еще одну операцию присвоения.

ТНЕ_В ( Е ) : = LENGTH ( 4.0 ) ;

Теперь переменная Е содержит эллипс с полуосями а = 5 и b = 4 (как и предыду- щий) и ее тип MST(E) снова становится ELLIPSE. Этот эффект мы называем обобщением по ограничениям.

Замечание. Предположим (как и в конце раздела 19.4), что тип CIRCLE имеет собст- венный подтип О CIRCLE (где к типу О CIRCLE относятся окружности, центр которых расположен в начале координат).

TYPE 0_CIRCLE POSSREP ( R LENGTH ) SUBTYPE OF ( CIRCLE )

CONSTRAINT ( THE_CTR ( 0_CIRCLE ) = POINT ( 0.0, 0.0 ) ) ;

Тогда текущее значение переменной Е в данное время может иметь конкретный тип 0_CIRCLE, а не просто CIRCLE. Предположим, что это так, и рассмотрим приведенную ниже последовательность операций присвоения:4

THE А ( Е ) := LENGTH ( 7.0 ) ; ТНЕ~В ( Е ) := LENGTH { 7.0 ) ;

В результате применения обобщения по ограничениям переменная Е после первой опе- рации присвоения будет содержать "просто эллипс". Однако после второй операции при- своения она снова будет содержать окружность. Но будет ли это "окружность класса О" или "просто окружность"? Очевидно, нам бы хотелось, чтобы это была именно "окружность класса О". На самом деле так оно и есть, потому что удовлетворяются ограни- чения для типа 0_CIRCLE (включая ограничения, наследуемые этим типом от типа CIRCLE).

Горизонтальное изменение типов

Снова будем полагать, что переменная Е относится к объявленному типу ELLIPSE. Мы уже знаем, как можно изменить тип переменной Е, "понизив его" (например, если кон- кретный тип переменной— ELLIPSE, то нам известно, как следует изменить значение переменной, чтобы ее текущий конкретный тип стал CIRCLE). Мы также знаем, как мож- но "повысить" тип переменной Е (например, если ее текущий конкретный тип — CIRCLE, то нам известно, как следует изменить значение переменной, чтобы ее текущий конкрет- ный тип стал ELLIPSE). Но как быть, если требуемое изменение типа оказывается "горизонтальным"? Предположим, что мы расширили пример таким образом, что тип ELLIPSE имеет два непосредственных подтипа, CIRCLE (Окружность) и NONCIRCLE (Не окружность)5. Если не слишком вдаваться в детали, то ясно следующее.

  • Если текущее значение переменной Е принадлежит типу CIRCLE (т.е. а = Ь), то изме- нение Е, после которого а > Ь, приведет к тому, что MSTJE) станет равным NONCIRCLE.

  • Если текущее значение переменной Е принадлежит типу NONCIRCLE (т.е. а > Ь), то из- менение Е, после которого а = Ь, приведет к тому, что MST(E) станет равным CIRCLE.

Таким образом, специализация по ограничениям учитывает также "горизонтальное" изменение типа.

Замечание. Пусть вас не удивляет отсутствие случая изменения переменной Е, в ре- зультате которого а < Ь; такое изменение невозможно, поскольку оно нарушает ограни- чение для типа ELLIPSE.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]