Программирование >>  Хронологические базы данных 

1 ... 231 232 233 [ 234 ] 235 236 237 ... 348


OPERATOR THE R ( С CIRCLE ) RETURNS ( LENGTH ) ;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

Другими словами, оператор Ор - это полиморфный оператор. Кроме того, полиморфизм в данном случае мог бы быть либо перегружаемым, либо включаемым. В разделе 19.3 этот вопрос будет рассмотрен подробнее.



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

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

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

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

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

19.3. Полиморфизм и заменимость

в этом разделе рассматриваются два ключевых понятия - полиморфизм и заменимость, которые вместе составляют основу для возможности повторного использования кода, упоминавшейся в разделе 19.1. Сразу же отметим, что оба понятия в действительности представляют собой различные взгляды на одно и то же явление. Тем не менее рассмотрим сначала понятие полиморфизма.

Полиморфизм

Из самого понятия наследования следует, что если Т - это подтип типа Т, то все операторы, которые применимы к значениям типа Т, применимы и к значениям типа Т. Например, если оператор AREA(e) является допустимым, где е- некоторый эллипс, то оператор AREA{c), где с - некоторая окружность, также должен быть допустимым. Заметим, что необходимо соблюдать аккуратность в отношении отличия параметров в смысле их типов, объявленных в определении оператора, и соответствующих аргу.мен-тов с действительными (конкретными) типами, использованных при вызове этого оператора. Например, оператор AREA определен с параметром, объявленным относящимся к типу ELLIPSE (см. раздел 19.2), а действительный (конкретный) тип аргумента в обращении к оператору AREA( с) - имеющим тип CIRCLE.

Действите.чьно, нет никакой логической необходимости да.же в том, чтобы все значения одного и того же типа и.мели одно и то же реальное представление. Например, одни точки .могут быть представлены в декартовой системе координат, а другие - в полярной системе координат; одни значения температуры могут быть представлены в градусах по Цельсию, а другие - в градусах по Фаренгейту: одни целые числа могут быть представлены как десятичные, а другие- как двоичные и т.д. (Конечно, системе должно быть известно, как преобразовывать реапьные представления во всех таких случаях, чтобы можно было правильно выполнять операции присвоения, сравнения и т.д.)



1 ... 231 232 233 [ 234 ] 235 236 237 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика