Введение в системы БД (542480), страница 192
Текст из файла (страница 192)
З В 13.31 для достижения подобного эффекта в определении типа Т предлагается использовать фразу БРЕС1АЬ12Е. Однако впоследствии мы приими к заключению, что для достижения желаемого результата никакого специального синтаксиса не требуется. 741 Глава 19. Наследование типов Из вышесказанного следует (по крайней мере, в нашей модели), что нет значений конкретного типа ЕЬЫРЯЕ, лля которых бы выполнялось равенство а = Ь.
Иначе говоря, значения конкретного типа ЕЬЬ1РЯЕ относятся только к настоящим эллипсам, которые не являются окружностями. В других же моделях наследования, напротив, значения конкретного типа ЕЬЫРЯЕ соответствуют эллипсам, которые могут быть или нв быть окружностями. Мы считаем нашу модель более приемлемой в качестве "реальной модели". Идея, согласно которой, например, эллипс с полуосями а = Ь должен относиться к типу С1НСЬЕ, называют специализацией по ограничениям [3.3), хотя следует предупредить, что некоторые авторы подразумевают под этим понятием совсем иное (см., например, [19.7) и [19.11)).
Пересмотр оператора ТНЕ псевдопеременная Напомним, что в главе 5 оператор ТНЕ лсевдодереиенная использовался для обновления одного компонента переменной, оставляя при этом остальные компоненты неизменными (здесь "компоненты" — это, конечно, компоненты некоторого возможного представления, а не обязательно реального представления). Пусть, например, переменная Е имеет объявленный тип ЕЬЫРЯЕ, и пусть текущим значением переменной Е будет эллипс с полуосями а = 5 и Ь = 3. Тогда в результате выполнения приведенного ниже оператора присвоения значение длины оси Ь переменной Е изменится, а длина оси а и положение центра останутся прежними.
ТНЕ В ( Е ) .'= ЬЕНЯТН ( 4.0 ) Как отмечалось в разделе 8.2 главы 8, операторы ТНР, лсевдолереиенная не являются логически необходимыми — фактически это просто удобные сокрашения. Например, предыдущая команда присвоения с оператором ТНŠ — это сокращенная запись для следующего оператора присвоенияь. Е:и Е1ЫРЯЕ ( ТНЕ А ( Е ), ЬЕНЯТН ( 4.0 ), ТНЕ СТВ ( Е ) ] Итак, рассмотрим приведенную ниже операцию присвоения.
ТНЕ В ( Е ) := ЬЕНЯТН ( 5.0 ) 1 По определению это присвоение эквивалентно следующему оператору. Е:и Е1ЫРЯЕ ( ТНЕ А ( Е ), ЬЕНЯТН ( 5.0 ), ТНЕ СТЕ ( Е ) ) 1 Следовательно, здесь должна вступить в силу специализация по ограничениям [поскольку выражение в правой части операции присвоения возвращает эллипс с полуосями а = Ь). В результате после выполнения присвоения тип МЯТ(Е] должен быть С1ЕСЬЕ, а не ЕЬЫРЯЕ. Рассмотрим еше одну операцию присвоения. ТНЕ В ( Е ):= ЬЕНЯТН ( 4.0 ) 1 В Отметим, кстати, чта оператор ТЕЕАТ 00)Д(магкна бима бм использовать и как псввдапврвмвнную (З.З(, на, апнть-таки, эта будет праста сакращвнная запись.
742 Часть )'. Дополнительные аспекты Теперь переменная Е содержит эллипс с полуосями а = 5 и Ь = 4 (как и предыдущий) и ее тип ИЯТ(Е) снова становится ЕЬЫРЯЕ. Этот эффект мы называем обобщением по ограничениям. Замечание. Предположим (как и в конце раздела ?9.4), что тип С1НСЬЕ имеет собственный подтип О С1НСЬЕ (где к типу О С1НСЬЕ относятся окружности, центр которых расположен в начале координат). ТУРЕ О С1ЙСЬЕ РОЯЯНЕР ( Н ЬЕНОТН ) ЯОВТУРЕ ОР ( С1НСЬЕ ) СОНЯТНА1НТ ( ТНЕ СТН ( О С1НСЬЕ ) = РО1ИТ ( 0.0, 0.0 ) ) ? Тогда текущее значение переменной Е в данное время может иметь конкретный тип О С1НСЬЕ, а не просто С1НСЬЕ. Предположим, что это так, и рассмотрим приведенную ниже последовательность операций присвоения;з ТНЕ А ( Е ) := ЬЕНОТН ( 7.0 ) ТНЕ В ( Е ) ге ЬЕНОТН ( 7.0 ) В результате применения обобщения по ограничениям переменная Е после первой операции присвоения будет содержать "просто эллипс".
Однако после второй операции присвоения она снова будет содержать окружность. Но будет ли это "окружность класса О" или "просто окружность"? Очевидно, нам бы хотелось, чтобы это была именно "окружность класса О". На самом деле так оно и есть, потому что удовлетворяются ограничения для типа О С?НСЬЕ (включая ограничения, наследуемые этим типом от типа С1НСЬЕ). Горизонтальное изменение типов Снова будем полагать, что переменная Е относится к объявленному типу ЕЬЫРЯЕ.
Мы уже знаем, как можно изменить тнп переменной Е, "понизив его" (например, если конкретный тнп переменной — ЕЬЬ1РЯЕ, то нам известно, как следует изменить значение переменной, чтобы ее текущий конкретный тип стал С1НСЬЕ). Мы также знаем, как можно "повысить" тип переменной Е (например, если ее текущий конкретный тип — С1НСЬЕ, то нам известно, как следует изменить значение переменной, чтобы ее текущий конкретный тип стал ЕЬЫРЯЕ). Но как быть, если требуемое изменение типа оказывается "горизонтальным"? Предположим, что мы расширили пример таким образом, что тип ЕЬЫРЯЕ имеет два непосредственных подтипа, С1НСЬЕ (Окружность) и НОНС1НСЬЕ (Не окружность)з.
Если не слишком вдаваться в детали, то ясно следующее. ° Если текущее значение переменной Е принадлежит типу С1НС? Е (т.е, а = Ь), то изме- пение Е, после которого а > Ь, приведетктому,что ИЯТ(Е) станетравнымНОНС1НСЬЕ. ° Если текущее значение переменной Е приналлежит типу НОНС1НСЬЕ (т.е. а > Ь), то изменение Е, после которого а = Ь, приведет к тому, что ИЯТ(Е) станет равным С1НСЬЕ. Таким образом, специализация по ограничениям учитывает также "горизонтальное" изменение типа. Как указывалось в главе В, в ?3.
37 предложена множественная форма операции присвоенизс которан могла вы позволить выполнять последовательность операторов присвоения, как одну операцию. В В результате тип ЕЬЫРЯЕ становится фиктивным типом (см. раздел ! 9 7А 743 Глава 19. Наследование типов Замечание. Пусть вас не удивляет отсутствие случая изменения переменной Е, в результате которого а < Ь; такое изменение невозможно, поскольку оно нарушает ограничение для типа ЕЬЫРБЕ. 19.6. Операции сравнения Предположим, имеются две обычные переменные, Е и С, с объявленными типами ЕВРЕЕ и С1КСЬЕ соответственно. Предположим также, что текущее значение переменной С присваивается переменной Е.
Е:= С Тогда совершенно ясно, что если выполнить сравнение значений этих переменных, то в результате должно быть получено значение истина. Е=С В общем виде соответствующее правило можно сформулировать так. Рассмотрим операцию сравнения Х = У, где Х и У вЂ” скалярные выражения. Объявленный тип )ЗТ(Х) должен быть подтипом объявленного типа СТ(У) нлн наоборот, в противном случае сравнение будет просто нелопустимым (проверяется при компиляции). Прн допустимом сравнении в результате получим значение истина, если конкретный тип ИЕТ(Х] равен конкретному типу ИБТ(У) и значение ч(Х) равно значению ч(У), в противном случае результатом будет значение ложь. Отметим, в частности„ что два значения нельзя сравнить "на равенство", если их конкретные типы различны.
Сравнения в реляционной алгебре Сравнения на равенство явно или неявно используются во многих операциях реляционной алгебры. И в случае поддержки механизма супертипов и подтипов, на первый взгляд, может показаться, что некоторые из этих операций будут выполняться в противоречии со здравым смыслом. Рассмотрим отношения КХ и КУ, представленные на рис, 19.2. Обратите внимание, что единственный атрибут А в отношении КХ имеет объявленный тнп ЕЬЫРЯЕ, а атрибут А в отношении КУ имеет объявленный тип С1КСЬЕ.
Примем, что значения вида Е1 — это эллипсы, не являющиеся окружностями, а значения СТ вЂ” это окружности. Конкретные типы для каждою значения выделены на рисунке строчными буквами и курсивом. Рис. )9.2. Отношения ЯХ и ЯУ А теперь рассмотрим результат операции соединения отношений КХ и КУ. Назовем это отношение К) (рис. !9.3). Очевидно, что каждое значение А в отношении КЮ обязательно будет иметь тип С1КСЬЕ (поскольку любое значение А в отношении КХ, конкретным ти- 744 Часть !'. Дополнительные аспекта! пом которого является ЕЬЫРЯЕ, не может сравниваться с любым значением А в отношении КУ).
Поэтому можно подумать, что атрибут А в отношении Кд должен быть объявлен с типом С1КСЬЕ, а не с типом ЕЬЫРЯЕ. Но рассмотрим следующие рассуждения. Рис. 193. Соединение КТотношений КХи КУ ° Поскольку в отношениях КХ и ВУ только один атрибут А, выражение КХ 101И КУ упрощается до КХ 1ИТЕКБЕСТ КУ. Поэтому в данных условиях правило относительно объявленного типа результирующего атрибута в операции 101И должно быть сведено к аналогичному правилу для операции 1ИТЕКЯЕСТ. ° Выражение КХ 1ИТЕКЯЕСТ КУ, в свою очередь, логически эквивалентно выражению КХ М1ИСЯ (КХ И1КСБ КУ).
Пусть результатом второй операции, т.е. КХ И1КЯЯ КУ, будет КК Тогда очевидно следующее. а) В общем случае второй операнд, т.е. КХ, будет включать некоторые значения А, имеющие конкретный тип ЕЬЫРБЕ, и поэтому объявленный тип атрибута А в КХ должен быть ЕЬЫРЯЕ. б) Таким образом, исходное выражение преобразуется в КХ И1ИСЯ КХ, где объявленный тип атрибута А в обоих отношениях, КХ и КХ, — ЕЬЬ1РБЕ. Поэтому получаем окончательный результат, в котором объявленный тип атрибута А в ВХ также должен быть, очевидно, ЕЬЫРЯЕ. ° Отсюда следует, что объявленный тип атрибута результата для операции 1ИТЕКБЕСТ (а значит, и для 101И) должен быть ЕЬЫРЯЕ, а не С1КСЬЕ несмотря на то, что каждое значение этого атрибута фактически должно иметь тип С1КСЬЕ! Теперь обратимся к реляционному оператору разности М1ИСЯ и прежде всего рассмотрим выражение КХ И1ИСБ КУ.
Очевидно, что некоторые значения атрибута А в результате этой операции будут иметь тип ЕЬЫРЯЕ, а не С1КСЬЕ, и поэтому объявленный тип А в таком результате должен быть ЕЬЫРБЕ. А какой тип должна иметь разность КУ М1ИЯЯ КХ? Ясно, что каждое значение в результате этой операции будет иметь тип СУКСЬЕ, и поэтому можно было бы предположить, что объявленный тип результата этой операции должен быть С1КСЬЕ, а не ЕЬЫРЯЕ. Однако обратите внимание, что выражение КХ 1КТЕКЯЕСТ КУ логически эквивалентно не только выражению КХ М1ИСЯ (КХ М1ИСБ КУ), как было сказано выше, но и выражению КУ И1КЯБ (КУ М1ИЯЯ КХ). Исходя из этого легко понять, что если считать, что в результате операции КУ И1ИСЯ КХ объявленный тип атрибута А будет С1КСЬЕ, то мы придем к противоречию. Отсюда следует, что объявленный тнп атрибута А лля операции М1ХЯЯ также должен быть ЕЬЫРБЕ, а не С1КСЬЕ, причем даже в случае операции КУ И1ИСЯ КХ, где каждое значение должно иметь тип С1КСЬЕ. И наконец рассмотрим операцию объединения КХ 0И10И КУ.