|
Программирование >> Хронологические базы данных
Переменные имеют тип Каждая переменная имеет ровно один объявленный тип. Например, можно объявить переменную следующим образом. VAR Е ELLIPSE ; Здесь объявленный тип переменной Е - ELLIPSE. Если наследование не применяется, все возможные значения переменных имеют только один тип, а именно - соответствующий объявленный тип. Однако при использовании наследования данная переменная будет иметь значение, которое может относиться к нескольким типам одновременно, т.е. текущее значение переменной Е может быть эллипсом, который в действительности является окружностью, а потому относится и к типу ELLIPSE, и к типу CIRCLE в одно и то же время. Одиночное и множественное наследования Существует две разновидности наследования: одиночное и множественное. Выражаясь неформально, одиночное наследование означает, что каждый подтип имеет ровно один супертип и наследует свойства лишь одного этого типа. В случае множественного наследования каждый подтип может иметь любое количество супертипов и наследовать свойства каждого из них. Очевидно, что первый вариант является частным случаем второго. Однако использование даже одиночного наследования является достаточно сложной задачей (такое утверждение может показаться несколько неожиданным, но это действительно так). Поэтому в настоящей главе мы ограничимся обсуждением лишь одиночного наследования и под общим термином наследование (при отсутствии дополнительных пояснений) всегда будем подразумевать именно одиночное наследование. Заинтересованному читателю можно рекомендовать обратиться к [3.3], где подробно обсуждаются оба вида наследования, как множественное, так и одиночное. Наследование скачярных значений, кортежей и отношений Очевидно, что наследование возможно как для скалярных, так и для нескалярных значений, поскольку, в конце концов, эти нескалярные значения построены из скалярных значений. В частности, механизм наследования может применяться также к значениям кортежей и отношений. Однако даже наследование скалярных значений является весьма сложным механизмом (что, опять-таки, несколько неожиданно). Поэтому мы ограничимся рассмотрением лишь наследования скалярных значений и будем подразумевать, что не уточненные дополнительно термины тип, значение и переменная означают тип, значение и переменную именно скалярного типа. В [3.3] можно найти сведения обо всех видах наследования, а также о наследовании как скалярных значений, так и кортежей и отношений. Напомним, что скалярный тип - это такой тип, который не имеет компонентов, видимых пользователю. Пусть вас не вводит в заблуждение то, что скалярные типы имеют возможные представления, которые, в свою очередь, действительно имеют видгсмые пользователю компоненты, как указывалось в главе 5. Эти компоненты являются компонентами возможного представления, а не компонентами типа, несмотря на то что.мы иногда для упрощения ссылаемся на нга так, как будто они действительно являются компонентами типа. Наследование структуры или поведения Напомним, что скалярные значения могут иметь внутреннюю (физическую) структуру или представление произвольной сложности. Например, эллипсы и окружности, как нам уже известно, могут вполне законно считаться скалярными значениями, хотя их внутренняя структура может быть довольно сложной. Однако внутренняя структура всегда скрыта от пользователя. Значит, когда мы говорим о наследовании (по крайней мере, в рамках нашей модели), мы не подразумеваем под этим наследование структуры, поскольку, с точки зрения пользователя, никакой структуры для наследования просто нет! Другими словами, нас интересует так называемое наследование поведения, а не наследование структуры. (Здесь подразумевается поведение операторов, хотя, напомним, что в нашей модели наследуются и офаничения.) Замечание. Безусловно, структурное наследование не исключается полностью. Однако, по нашему мнению, оно является вопросом, относящимся к реализации, а не к модели. Подтаблицы и супертаблицы К этому моменту читателю должно быть уже понятно, что обсуждаемая модель наследования связана с так называемым наследованием доменов (напомним, что домены и типы - это одно и то же). Однако, когда речь о возможностях наследования идет в реляционном контексте, большинство чаше всего полагает, что имеется в виду наследование таблиц. Например, в язык SQL3 включена поддержка концепции подтаблиц и супертаблиц , в соответствии с которой определенная таблица В может наследовать все столбцы какой-то другой таблицы А и, кроме того, иметь собственные столбцы (см. приложение Б). Однако, на наш взгляд, идея подтаблиц и супертаблиц - это совершенно особый феномен, который, возможно, кому-то и интересен (хотя мы к этому относимся скептически [13.12]), но не имеет ничего общего с собственно наследованием типов. И последнее замечание. В действительности тема наследования типа относится к данным в целом, а не ограничивается лишь данными, хранимыми в базах данных. Поэтому из соображений простоты в большинстве примеров этой главы будут использоваться локальные данные (обычные профаммные переменные и т.п.), а не данные базы данных. 19.2. Иерархия типов Рассмотрим реальный пример, который будет использоваться до конца этой главы. Он включает набор геометрических типов- PLANE FIGURE (Плоская фигура), ELLIPSE (Эллипс), CIRCLE (Окружность), POLYGON (Многоугольник) и т.д. Все используемые типы упорядочены в виде так называемой иерархии типов или, в более общем случае, в виде графа типов (рис. 19.1). Ниже приведены упрощенные определения для некоторых геометрических типов, записанные на языке Tutorial D (и, в частности, ограничения типов). TYPE PLANE FIGURE ... ; TYPE ELLIPSE POSSREP ( A LENGTH, В LENGTH, CTR POINT ) SUBTYPE OF ( PLANE FIGURE ) CONSTRAINT ( THE A ( ELLIPSE ) > THE B ( ELLIPSE ) ) ; Глава 19. Наследование типов 729 TYPE CIRCLE POSSREP ( R LENGTH, CTR POINT ] SUBTYPE OF ( ELLIPSE ) CONSTRAINT ( THE A ( CIRCLE ) = THE В CIRCLE Исходя из этих определений система будет знать, что, например, тип CIRCLE - это подтип типа ELLIPSE, и поэтому операторы и ограничения, которые, в общем, применимы для эллипсов, в частности, применимы и для окружностей. PLANE FIGURE ELLIPSE CIRCLE POLYGON ~~r~ RECTANGLE SQUARE Puc. 19.1. Пример иерархии типов Необходимо кратко пояснить смысл спецификации POSSREP для типов ELLIPSE и CIRCLE. Прежде всего, предполагается (для простоты), что эллипсы всегда ориентированы таким образом, что их большая ось располагается горизонтально, а меньшая - вертикально. Поэтому эллипсы могут быть представлены своими полуосями а и b (и центром). Окружности же могут быть представлены радиусом г (и центром). Также предполагается, как и в главе 8, что все эллипсы таковы, что большая полуось а всегда не меньше, чем меньшая полуось Ь (т.е. эллипсы низкие и широкие , а не высокие и тонкие ). Ниже в сокращенном виде представлены определения для некоторых операторов, связанных с указанными выше типами. OPERATOR AREA ( Е ELLIPSE ) RETURNS ( AREA ) ; /* область ; обратите внимание, что имя AREA используется в обоих */ /* случаях: для самого оператора и для типа результата */ END OPERATOR ; OPERATOR ТНЕ А ( Е ELLIPSE ) RETURNS ( LENGTH ) ; /* полуось a */ ...; END OPERATOR ; OPERATOR THE B ( E ELLIPSE ) RETURNS ( LENGTH ) ; /* полуось b */ ... ; END OPERATOR ; OPERATOR THE CTR ( E ELLIPSE ) RETURNS ( POINT ) ; /* центр */ ... ; END OPERATOR ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |