Введение в системы БД (542480), страница 193
Текст из файла (страница 193)
В данном случае ее результат будет включать некоторые значения атрибута А, в общем случае — конкретного типа ЕЬЫРЯЕ, и поэтому объявленный тип атрибута А в результирующем отношении этой 745 Глава 19. Наследование типов операции должен быть ЕЬЫРЯЕ.
Таким образом, и для операции объединения в результирующем отношении объявленный тип атрибута й также должен быть ЕЬЫРЯЕ (но об этом частном случае, в отличие от операций 001И, 1ИТЕКЯЕСТ и И1М08, вряд ли можно сказать, что он интуитивно непредсказуем). Теперь сформулируем общее правило. ° Пусть гх и гу — отношения с общим атрибутом А, и пусть объявленные типы атрибута й в отношениях гх и гу — соответственно 0Т(йх) и 0Т(Ау).
Рассмотрим соединение отношений гх и гу (обязательно по атрибуту й или по крайней мере с его участием). Объявленный тип 0Т(йх) должен быть подтипом типа 0Т(йу) или наоборот, в противном случае выполнение соединения будет недопустимо (проверяется во время компиляции). Если соединение допустимо, можно считать, не теряя общности, что 0Т(йу) — это подтип 0Т(Ах). Тогда объявленный тип атрибута й в результирующем отношении операции будет 0Т(Ах). ° Аналогичные соображения справедливы и для операций объединения, пересечения и разности. В каждом случае соответствующие атрибуты операндов должны быть такими, чтобы объявленный тип одного из них был подтипом объявленного типа другого и объявленный тип соответствующего атрибута результата будет менее конкретным из двух объявленных типов (здесь под менее конкретным нз двух типов Т и Т', один из которых является подтипом другого, подразумевается тот, который является супертипом).
Операторы проверки типа В предыдущем разделе был приведен фрагмент кода, в котором применялись операторы вида 1Б 800АКЕ, 18 С1КСЬЕ и т.д., используемые лля проверки, относится лн указанное значение к определенному типу. Рассмотрим эти операторы подробнее. Прежде всего, будем считать, что определение некоторого типа Т приводит к автоматическому определению оператора следующего вида. 18 Т ( Х ) Здесь Х вЂ” скалярное выражение, такое, что 0Т(Х] является супертипом типа Т (проверяется при компиляции). Вычисление выражения в целом дает значение истина, если выражение Х принадлежит типу Т, и значение ложь — в противном случае.
Отметим, что объявленный тип указанного аргумента Х должен быть супертипом указанного типа Т. Поэтому, например, если С вЂ” переменная объявленного типа С1КСЬЕ, то приведенное ниже выражение будет недопустимым (ошибка типа будет обнаружена при компиляции). 18 800АКЕ ( С ] С другой стороны, оба следующих выражения допустимы и в результате дают значение истина. 18 С1КСЬЕ ( С ) 18 ЕЬЫРБЕ ( С ) 74б Часть )'. Дополнительные аспекты Наконец, если Š— переменная объявленного типа ЕЬЫРЯЕ, но конкретный тип ее текущего значения — некоторый подтип типа С1КСЬЕ, то результат приведенного ниже выражения также будет истиной~. 1Я С1КСЬЕ ( Е ) Мы также подразумеваем, что определение некоторого типа Т приводит к автоматическому определению оператора следующего вида.
1Я МЯ Т ( Х ) Здесь Х вЂ” скалярное выражение, а ЕТ(Х) — супертип типа Т (опять же, это проверяется при компиляции). Вычисление выражения в целом дает значение истина, если выражение Х принадлежит типу Т, и значение ложь — в противном случае.
Замечание. Обратите внимание, что в то время как, например, оператор 1Б ЕЬЫРЯЕ на естественном языке можно лучше всего сформулировать как "является эллипсом", то оператор 1Б ИЯ ЕЬЫРЯЕ на естественном языке лучше всего сформулировать как "является конкретно эллипсом". Ниже приводится пример, включающий типы прямоугольника, квадрата и оператор 1Я МЯ КЕСТАНОЬЕ. 'чйн К КЕСТйНОЬЕ ; 1Р 1Б МЯ КЕСТАНОЬЕ ( К ) ТНЕН САЬЬ КОТАТЕ ( К ) ) Интуитивно ясно, что оператор КОТАТЕ (Вращать) — это оператор, с помощью которого заданный в качестве аргумента прямоугольник поворачивается на 90' вокруг центра, и что в подобном вращении нет никакого смысла, если рассматриваемый прямоугольник является квадратом.
Проверка типа также важна для реляционных операторов. Рассмотрим следующий пример. Пусть переменная-отношение К имеет атрибут А объявленного типа ЕЬЫРЯЕ, и допустим, что требуется получить такие кортежи переменной-отношения К, в которых значение атрибута А в действительности является окружностью с радиусом, большим 2. Можно попытаться решить эту задачу следующим образом. К ННЕКЕ ТНЕ К ( А ) > ЬЕНОТН ( 2.0 ) Однако это выражение будет квалифицировано как ошибочное при компиляции, поскольку лля оператора ТНЕ К требуется, чтобы аргумент имел тип С1КСЬЕ, а атрибут й имеет объявленный тип ЕЬЫРБЕ, а не С1КСЬЕ. (Если бы проверка при компиляции не выполнялась, то ошибка была бы, конечно, обнаружена во время выполнения, причем зто произошло бы прн обработке первого же из кортежей, который является просто эллипсом, а не окружностью.) В ГЗ.ЗЗ определяются обобщенные формы всех операторов "проверки типов", которые представлены в этом подразделе.
Например, обобщенная форма оператора 1Б Т проверяет, относится ли один операнд к тому же типу, что и другой. Она мажет использоваться вместо оператора, просто проверяющего, принадлежит ли переменная некоторииу явно указанному типу.
Глава 19. Наследование типов Очевидно, что необходимо как-то отсеять кортежи, в которых значение атрибута А является просто эллипсом, и только после этого проверить условие, что радиус должен быть больше 2. Рассмотрим теперь другую формулировку возможного решения. В : 1Я С1ВСЬЕ ( А ) ИНЕВЕ ТНЕ В ( А ) > ЬЕМОТН ( 2.0 ) Согласно этому выражению при выполнении операции должны возвращаться такие кортежи, в которых значение атрибута А является окружностью с радиусом, большим 2.
Точнее, возвращается отношение, имеющее следующие свойства. 1. Оно имеет тот же заголовок, что и переменная-отношение В, но объявленный тип атрибута А в нем — С1ВСЬЕ, а не ЕЬЫРБЕ. 2. Его тело содержит те кортежи из переменной-отношения В, в которых значение атрибута А будет иметь тип С1ВСЬЕ, т.е, будет окружностью и радиус этой окружности будет больше 2. Другими словами, то, что мы только что рассмотрели,— это новый реляционный оператор следующего вида. В:1БТ(А) Здесь  — реляционное выражение, а А — атрибут отношения (скажем, г), обозначаемого этим выражением. Объявленный тип ОТ(А) атрибута А должен быть супертипом типа Т (проверяется при компиляции). Значение данного выражения в целом определяет отношение со следующими свойствами.
1. Оно имеет тот же заголовок, что и отношение г, но объявленный тип атрибута А в этом заголовке — Т. 2. Его тело содержит кортежи г, в которых атрибут А имеет значение типа Т, и, кроме того, объявленный тип атрибута А в каждом из таких кортежей будет Т. Аналогично определяется другой новый реляционный оператор следующего вида. Вг1БМЯТ(А) 19.7. Операторы, версии и сигнатуры Как утверждалось в разделе 19.3, любой заданный оператор может иметь много различных скрытых версий реаяизииии (что известно также как явная специализация).
Это означает, что по мере продвижения в иерархии типов от некоторого супертипа Т к некоторому подтипу Т' необходимо, чтобы по крайней мере существовала возножиосеь переписать реализацию (по разным соображениям) операторов типа Т для типа Т'. В качестве примера рассмотрим следующий оператор МОЧЕ. ОРЕВАТОВ МОЧЕ ( Е ЕЬЫРБЕ, В ВЕСТАМОЬЕ ) ВЕТОВМБ ( ЕЬЬ1РЯЕ ) ЧЕВЯ1ОМ ЕВ МОЧЕ ВЕТОВМ ( ЕЬЫРЯЕ ( ТНЕ А ( Е ), ТНЕ Е ( Е ), В СТВ ( В ) ) ЕМЮ ОРЕВАТОВ ; 748 Часть г'. Дополнительные аспекты Оператор МОЧЕ выполняет "перемещение" эллипса Е таким образом, что его центр помещается в центр прямоугольника К.
Точнее говоря, он возвращает эллипс, который в точности соответствует эллипсу, указанному его параметром Е, но центр возвращаемого эллипса совпадает с центром прямоугольника, заданного параметром К. Обратите внимание, что фраза УЕКЯ1ОМ во второй строке определения вводит еше одно имя, ЕК МОЧЕ, используемое именно для конкретной версии оператора МОЧЕ (подробности приводятся в следующем разделе). Кроме того, обратите внимание, что неявно предполагается существование оператора К СТК, который возвращает координаты центра заданного прямоугольника. А теперь предположим, что существует механизм явной специализации, т.е. требуется определить другую версию оператора МОЧЕ, выполняющего перемещение окружностей, а не эллипсов'с. ОРЕККТОК МОЧЕ ( С С1КСЬЕ, К КЕСТВМБЬЕ ) КЕТОКМБ ( С1КСЬЕ ] ЧЕКЯХОМ СК МОЧЕ КЕТОКМ ( СХКСЬЕ ( ТВЕ К ( С ), К СТК ( К ) ] ЕМО ОРЕКАТОК > Аналогично можно было бы получить явную специализацию для оператора МОЧЕ (скажем, ЕЯ МОЧЕ), если бы аргументы имели соответственно конкретные типы ЕЬЬТРБЕ и Б()ОВКЕ, а аргументы конкретных типов С1КСЬЕ и Я(]БЕКЕ, например, — СЯ МОЧЕ.