Введение в системы БД (542480), страница 188
Текст из файла (страница 188)
Если ч — некоторое значение, то его можно представить как помеченное неким флажком значение с надписью "Я— целое", "Я вЂ” номер поставшика", "Я вЂ” окружность" и т.д. Поэтому при отсутствии наследования каждое значение будет относиться строго к одному типу. При использовании наследования значение может относиться к нескольким типам одновременно, т.е. иметь тип ЕЬЬЬРЕЕ н С1ЕСЬЕ в одно и то же время.
727 Глава 19. Наследование типов ° Переменные имеют тип Каждая переменная имеет ровно один объявленный тип. Например, можно объявить переменную следующим образом. зУДК Е ЕЬЫРЯЕ Здесь объявленный тип переменной Š— ЕБЕ1РЯЕ. Если наследование не применяется, все возможные значения переменных имеют только один тип, а именно— соответствующий объявленный тип. Однако при использовании наследования данная переменная будет иметь значение, которое может относиться к нескольким типам одновременно, т.е. текущее значение переменной Е может быть эллипсом, который в действительности является окружностью, а потому относится и к типу ЕЬ11РЯЕ, и к типу С1КС1Е в одно и то же время.
° Одиночное и множественное наследования Существует две разновидности наследования: одиночное и множественное. Выражаясь неформально, одиночное наследование означает, что каждый подтип имеет ровно один супертип и наследует свойства лишь одного этого типа. В случае множественного наследования каждый подтип может иметь любое количество супертипов и наследовать свойства каждого нз них.
Очевидно, что первый вариант является частным случаем второго. Однако использование даже одиночного наследования является достаточно сложной задачей [такое утверждение может показаться несколько неожиданным, но это действительно так).
Поэтому в настоящей главе мы ограничимся обсуждением лишь одиночного наследования и под общим термином наследование (при отсутствии дополнительных пояснений) всегда будем подразумевать именно одиночное наследование. Заинтересованному читателю можно рекомендовать обратиться к [3.3), где подробно обсуждаются оба вида наследования, как множественное, так и олиночное. ° Наследование скалярных значений, кортежей и отношений Очевидно, что наследование возможно как для скалярных, так и для нескалярных значений', поскольку, в конце концов, эти нескалярные значения построены из скалярных значений. В частности, механизм наследования может применяться также к значениям кортежей и отношений. Однако даже наследование скалярных значений является весьма сложным механизмом [что, опять-таки, несколько неожиданно).
Поэтому мы ограничимся рассмотрением лишь наследования скалярных значений и будем подразумевать, что не уточненные дополнительно термины тип, значение и переменная означают тип, значение и переменную именно скалярного типа. В [3.3) можно найти сведения обо всех видах наследования, а также о наследовании как скалярных значений, так и кортежей и отношений. г Папалчначь чпю скалярный тип — зта такой тип, который не илчеет компонентов, видаиых пользователю. Пусть вас не вводит в заблуждение та, чта гкаллриыг типы чьиеют возможные представления, которые, в свою ачгредь, действительна ичеют видимые пользователю калтаненты, как указывачагь в главе 5. Эти кампаненты лвллютгл кампаиентаии вазмажнага представления, а не кампанентани типа, неглзатрл иа та что.ны иногда для упраиЗенил ссылаемся на них так, как будто ани действительно являются кампаиеитами пшпа.
728 ЧОСгПЬ )г. ДОПОгтНУПЗЕЛЬНЫЕ ОСПЕКгПЬГ ° Наследование структпуры или поведения Напомним, что скалярные значения могут иметь внутреннюю (физическую) структуру илн представление произвольной сложности. Например, эллипсы и окружности, как нам уже известно, могут вполне законно считаться скалярными значениями, хотя их внутренняя структура может быть довольно сложной. Однако внутренняя структура всегда скрыта ат патьзаватпетя. Значит, когда мы говорим о наследовании (по крайней мере, в рамках нашей модели), мы не подразумеваем под этим наследование структуры, поскольку, с точки зрения пользователя, никакой структуры для наследования просто нет! Другими словами, нас интересует так называемое наследование поведения, а не наследование структуры. (Здесь подразумевается "поведение" операторов, хотя, напомним, что в нашей модели наследуются и ограничения.) Заттечание.
Безусловно, структурное наследование не исключается полностью. Однако, по нашему мнению, оно является вопросом, относящимся к реализации, а не к модели. ° Подтаблицы и супертаблицы К этому моменту читателю должно быть уже понятно, что обсуждаемая модель наследования связана с так называемым наследованием доменов (напомним, что домены и типы — это одно и то же). Однако, когда речь о возможностях наследования идет в реляционном контексте, большинство чаше всего полагает, что имеется в виду наследование таблиц.
Например, в язык ЯОБ3 включена поддержка концепции "подтаблиц и супертаблиц", в соответствии с которой определенная таблица В может наслеловать все столбцы какой-то другой таблицы А и, кроме того, иметь собственные столбцы (см. приложение Б). Однако, на наш взгляд, идея "подтаблиц и супертаблиц" — это совершенно особый феномен, который, возможно, кому-то и интересен (хотя мы к этому относимся скептически [13.12]), но не имеет ничего общего с собственно наследованием типов.
И последнее замечание. В действительности тема наследования типа относится к данным в целом, а не ограничивается лишь данными, хранимыми в базак данных. Поэтому из соображений простоты в большинстве примеров этой главы будут использоваться локальные данные (обычные программные переменные и т.п.), а не данные базы данных. 19.2. Иерархия типов Рассмотрим реальный пример, который будет использоваться до конца этой главы. Он включает набор геометрических типов — РЕАНЕ Г160НЕ (Плоская фигура), ЕВРЕЕ (Эллипс), С1КСЬЕ (Окружность), РОЫООН (Многоугольник) и т.д.
Все используемые типы упорядочены в виде так называемой иерархии типов или, в более общем случае, в виде графа типов (рис. 19.1). Ниже приведены упрощенные определения для некоторых геометрических типов, записанные на языке Тщова) В (и, в частности, ограничения типов). ТУРЕ РЬАНЕ Г16ОКЕ ТУРЕ ЕЬЫРЯЕ РОЯЯНЕР ( А ЕЕНОТН, В ЬЕНОТН, СТН РО1НТ ) ЯВВТХРЕ ОГ ( РЬАНЕ Г16ВНЕ ) СОНЯТНА1НТ ( ТНЕ А ( ЕВРЕЕ ) > ТНЕ В ( ЕВРЕЕ ) ) 729 Глава 19. Наследование типов ТУРЕ С1КСЬЕ РОЯЯКЕР ( К ЬЕМОТН, СТВ Р01МТ ) ЯОВТУРЕ ОР ( ЕЬЫРЯЕ ) СОМЯТКА|МТ ( ТНЕ А ( С1КСЬЕ ] = ТНЕ В ( С1КСЬЕ ) ) Исходя из этих определений система будет знать, что, например, тип С1КСЬŠ— это подтнп типа ЕЬЫРБЕ, и поэтому операторы и ограничения, которые, в общем, применимы для эллипсов, в частности, применимы н для окружностей. Рис.
!9.!. Пример иерархии типов Необходимо кратко пояснить смысл спецификации РОББКЕР лля типов ЕЬЫРБЕ и С1КСЬЕ. Прежде всего, предполагается (для простоты), что эллипсы всегда ориентированы таким образом, что их большая ось располагается горизонтально, а меньшая — вертикально. Поэтому эллипсы могут быть представлены своими полуосями а и Ь (н центром). Окружности же могут быть представлены радиусом г (и центром). Также предполагается, как и в главе 8, что все эллипсы таковы, что большая полуось а всегда не меньше, чем меньшая полуось Ь (т.е, эллипсы "низкие и широкие ", а не "высокие и тонкие"). Ниже в сокращенном виде представлены определения для некоторых операторов, связанных с указанными выше типами.
ОРЕКАТОК АКЕА ( Е ЕЬЬ|РЯЕ ) КЕТОКМЯ ( АКЕА ) /* "область"И обратите внимание, что имя АКЕА используется в обоих */ /* случаях: для самого оператора и для типа результата */ ЕЮ ОРЕКАТОК ОРЕВАТОК ТНЕ А ( Е ЕЬЫРЯЕ ) КЕТОКМБ ( ЬЕМОТН ) /* "полуось а" */ ЕМО ОРЕКАТОК ОРЕКАТОК ТНЕ В ( Е ЕЬЫРЯЕ ) КЕТОКМЯ ( ЬЕМОТН ) /" "полуось Ь" */ ... ЕЮ ОРЕКАТОК ОРЕКАТОК ТНЕ СТК ( Е ЕЬЫРЯЕ ) КЕТОКМЯ ( Р01МТ ) /* "центр" '/ ЕЮ ОРЕВАТОК 7ЗО Часть )х. дополнительные аспекты ОРЕНАТОН ТНЕ Н ( С СХНСЬЕ ) НЕТОННЯ ( ЬЕНОТН ) /' "радиус" '/ ...
ЕНО ОРЕНАТОН ; Все операторы, кроме ТНЕ Н, применяются к значениям типа ЕЬЬ1РЯЕ и поэтому заведомо и к значениям типа С1НСЬЕ. Оператор ТНЕ Н, напротив, применяется лишь к значениям типа С1НСЬЕ. Терминология Прежде чем двигаться дальше, необходимо ввести еше несколько определений и терминов, которые являются относительно простыми. 1. Супертип супертипа сам является супертипом. Например, тип РОЬХООН вЂ” это супертип типа ЯЯОАНЕ (Квадрат). 2. Каждый тип является супертипом для самого себя.