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

19.2. Иерархия типов

Рассмотрим реальный пример, который будет использоваться до конца этой главы. Он включает набор геометрических типов — PLANE_FIGURE (Плоская фигура), ELLIPSE (Эллипс), CIRCLE (Окружность), POLYGON (Многоугольник) и т.д. Все используемые типы упорядочены в виде так называемой иерархии типов или, в более общем случае, в виде графа типов (рис. 19.1). Ниже приведены упрощенные определения для некоторых гео- метрических типов, записанные на языке Tutorial D (и, в частности, ограничения типов).

TYPE PLANE_FIGURE ... ;

TYPE ELLIPSE POSSREP ( A LENGTH, В LENGTH, CTR POINT ) SOBTYPE_OF ( PLANE_FIGURE )

CONSTRAINT j THE_A ( ELLIPSE ) > THE_B ( ELLIPSE ) ) ;

TYPE CIRCLE POSSREP ( R LENGTH, CTR POINT ) SOBTYPE_OF ( ELLIPSE )

CONSTRAINT ( THE_A ( CIRCLE ) = THE_B ( CIRCLE ) ) ;

Исходя из этих определений система будет знать, что, например, тип CIRCLE — это подтип типа ELLIPSE, и поэтому операторы и ограничения, которые, в общем, примени- мы для эллипсов, в частности, применимы и для окружностей.

plane figure

ellipse

polygon

~~г~

Необходимо кратко пояснить смысл спецификации POSSREP для типов ELLIPSE и CIRCLE. Прежде всего, предполагается (для простоты), что эллипсы всегда ориенти- рованы таким образом, что их большая ось располагается горизонтально, а мень- шая — вертикально. Поэтому эллипсы могут быть представлены своими полуосями а и b (и центром). Окружности же могут быть представлены радиусом г (и центром). Также предполагается, как и в главе 8, что все эллипсы таковы, что большая полуось а всегда не меньше, чем меньшая полуось b (т.е. эллипсы "низкие и широкие ", а не "высокие и тонкие").

Ниже в сокращенном виде представлены определения для некоторых операторов, связанных с указанными выше типами.

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 j E ELLIPSE ) RETURNS ( POINT ) ;

/* "центр" */ ... ; END OPERATOR ;

OPERATOR THE_R ( С CIRCLE ) RETURNS ( LENGTH ) ;

/* "радиус" */ ... ; END OPERATOR ;

Все операторы, кроме THE_R, применяются к значениям типа ELLIPSE и поэтому заве- домо и к значениям типа CIRCLE. Оператор THE_R, напротив, применяется лишь к значе- ниям типа CIRCLE.

Терминология

Прежде чем двигаться дальше, необходимо ввести еще несколько определений и тер- минов, которые являются относительно простыми.

  1. Супертип супертипа сам является супертипом. Например, тип POLYGON — это супертип типа SQUARE (Квадрат).

  2. Каждый тип является супертипом для самого себя. Например, тип ELLIPSE является супертипом для типа ELLIPSE.

  3. Если А— супертип типа В и типы А и В различны, то тип А— действительный (proper) супертип типа В. Например, тип POLYGON — это действительный супертип типа SQUARE.

Безусловно, аналогичные замечания справедливы и для подтипов.

  1. Подтип подтипа сам является подтипом. Например, тип SQUARE — это подтип типа POLYGON.

  2. Каждый тип является подтипом для самого себя. Например, тип ELLIPSE является подтипом типа ELLIPSE.

  3. Если В — подтип типа А и типы В и А различны, то тип В — действительный под- тип типа А. Например, тип SQUARE — это действительный подтип типа POLYGON.

Кроме того, дадим дополнительные определения.

  1. Если А — супертип типа В и не существует типа С, который был бы действитель- ным подтипом типа А и действительным супертипом типа В, то А — непосредст- венный супертип типа В, а В — непосредственный подтип типа А. Например, тип RECTANGLE — непосредственный супертип типа SQUARE, а тип SQUARE — непосред- ственный подтип типа RECTANGLE. (Отметим, что в синтаксисе языка Tutorial D ключевое слово SUBTYPE_OF означает именно "непосредственный подтип".)

  2. Корневой тип — это тип, не имеющий ни одного действительного супертипа. На- пример, тип PLANE_FIGURE — это корневой тип.

Замечание. Это не означает, что может существовать только один корневой тип. Однако, если имеются два или более корневых типа, всегда можно ввести тот или иной вариант "системного" типа, который будет непосредственным супертипом для всех остальных. Поэтому, не теряя общности, можно считать, что корневой тип всегда один.

9. Листовой тип — это тип, не имеющий ни одного собственного подтипа. Напри- мер, тип CIRCLE — это листовой тип.

Замечание. Данное определение несколько упрощено, хотя и вполне удовлетвори- тельно для наших целей (однако в случае множественного наследования его потре- буется дополнить [3.3]).

Каждый действительный подтип имеет только один действительный супертип.

Замечание. Это явное следствие из сделанного выше допущения о том, что здесь будет рассматриваться только одиночное наследование. Как уже отмечалось, все возможные последствия отмены данного допущения (т.е. множественное наследо- вание) подробно описаны в [3.3].

Если в иерархии существует по крайней мере один тип и не существует циклов (т.е. последовательностей вида Tl, Т2, ТЗ, Тп, таких, что тип Т1— непо- средственный подтип типа Т2, тип Т2 — непосредственный подтип типа ТЗ, ... и Тп — непосредственный подтип типа Т1), то по крайней мере один тип дол- жен быть корневым.

Замечание. На самом деле никаких циклов быть просто не может (почему?).

Предположение о несвязности

Для упрощения обсуждения примем еще одно допущение. Если Tl и Т2 — различные корневые типы или различные непосредственные подтипы некоторого супертипа (откуда, в частности, следует, что ни один из них не является подтипом другого), то бу- дем считать, что эти типы являются несвязанными, т.е. не существует значений, при- надлежащих обоим типам, Tl и Т2. Например, не существует значений, относящихся од- новременно к типу ELLIPSE и к типу POLYGON.

Прямыми следствиями этого предположения являются приведенные ниже утверждения.

  1. Различные иерархии типов являются несвязанными.

  2. Различные листовые типы являются несвязанными.

  3. Каждое значение относится ровно к одному конкретному типу. Например, неко- торое значение может быть именно эллипсом, а не окружностью, т.е. конкретный тип этого значения — ELLIPSE (в реальном мире некоторые эллипсы не являются окружностями). В действительности вместо того, чтобы сказать, что конкретный тип некоторого значения v есть Т, будет лучше сказать, что множество типов, к ко- торым относится значение v, — это множество всех супертипов типа Т (множество, которое, конечно, включает и сам тип Т).

Одно из преимуществ принятия допущения о несвязности заключается в том, что ис- ключается двусмысленность, которая может иметь место в противном случае. Предпо- ложим, что некоторое значение v относится к двум типам, Т1 и Т2, причем ни один из них не является подтипом другого. Далее предположим, что оператор Ор был определен для типа Т1, а другой, с тем же именем Ор, — для типа Т21. Тогда применение оператора Ор с аргументом v могло бы привести к неоднозначности.

Замечание. Предположение о несвязности имеет смысл, поскольку мы ограничиваем- ся рассмотрением лишь одиночного наследования, а для множественного наследования это ограничение должно быть снято. Детальное обсуждение данного вопроса можно най- ти все в той же работе [3-3].

Физическое представление

Хотя нас интересует, прежде всего, модель наследования, а не ее физическая реали- зация, все же имеются вопросы, в которых необходимо разобраться подробнее, чтобы яснее представлять концепцию наследования в целом. Вот один из таких вопросов.

15. Из того, что тип В является подтипом типа А, не следует, что реальное (скрытое) представление значений типа В то же самое, что и значений типа А3. Например, эл- липсы реально могут быть представлены их центрами и полуосями, в то время как окружности — центрами и радиусами (хотя в общем случае не существует каких- либо требований в отношении того, чтобы реальные представления были точно та- кими, как вышеназванные).

Для изучения нескольких последующих разделов этот вопрос также будет важен.

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