|
Программирование >> Хронологические базы данных
ря в более общем плане, подтипами от супертиповНо (возвращаясь к окружностям и цветным окружностям) очевидно, что объявленное возможное представление для типа CIRCLE не является возможным представлением для типа COLORED CIRCLE, поскольку в нем нет ничего, что могло бы представлять цвет! Это говорит о том, что цветные окружности не являются окружностями в том же смысле, что и, например, окружности и эллипсы. Действительный смысл понятия подтипа Следующий аргумент связан с предыдущим, но он логически является более строгим. Не существует способа получения какой-либо цветной окружности из некоторой окружности посредством специализации по ограничениям. Для объяснения этого утверждения опять возвратимся к примеру с эллипсами и окружностями. Ниже вновь приведены соответствующие определения типов. TYPE ELLIPSE POSSREP ( А LENGTH, В LENGTH, CTR POINT ) ... CONSTRAINT ( THE A ( ELLIPSE ) > THE B ( ELLIPSE ) ) ; TYPE CIRCLE POSSREP ( R LENGTH, CTR POINT ) SUBTYPE OF ( ELLIPSE ) CONSTRAINT ( THE A ( CIRCLE ) = THE B ( CIRCLE ) ) ; Как мы видели ранее, фраза CONSTRAINT для типа CIRCLE гарантирует, что эллипс с равными полуосями а = b будет автоматически специализирован к типу CIRCLE. Но в случае цветных окружностей и вообще окружностей нет каких-либо предложений CONSTRAINT, которые можно было бы записать в определении типа COLORED CIRCLE и которые по аналогии со случаем с эллипсами и окружностями позволили бы специализировать некоторую окружность к типу COLORED CIRCLE. Иными словами, нет офаничений типа, которые можно было бы сформулировать таким образом, что если бы им удовлетворяла некоторая данная окружность, то это прямо означало бы, что она в действительности является цветной. Поэтому, опять же, представляется более разумным считать типы COLORED CIRCLE и CIRCLE совершенно разными типами и, в частности, считать, что тип COLORED CIRCLE имеет возможное представление, в котором один компонент относится к типу CIRCLE, а другой - к типу COLOR. В последнем случае данному типу можно дать следующее определение. TYPE COLORED CIRCLE POSSREP ( CIR CIRCLE, COL COLOR ) ... ; Ha самом деле мы здесь затронули вопрос, который можно поставить гораздо шире. Фактически мы считаем, что определение подтипов должно всегда задаваться через специализацию по ограничениям! Наше пpezлoжeниe заключается в том, что, если тип Мы не относим их подобным образом к нашей формальной модели, т.е. мы не относим к модели такие наследуемые возможные представления, как объявленные, поскольку, если бы они были объявлены, это привело бы к противоречию. А именно, если мы говорим, что тип CIRCLE наследует возможное представление от типа ELLIPSE, то, как указано в [3.3], требовалось бы, чтобы для переменной объявленного типа CIRCLE были допустимы операторы присвоения THE А и THE В, а мы, безусловно, уже знаем, что это не так. Поэтому выражение Тип CIRCLE наследует возможное представление от типа ELLIPSE - это лишь манера выражаться; данное выражение не несет никакой формальной нагрузки. Т - это подтип типа Т, всегда должно существовать такое ограничение типа, что если оно удовлетворяется некоторым заданным значением типа Т, то рассматриваемое значение на самом деле является некоторым значением типа Т (и должно быть автоматически специализировано к типу Т). Предположим, что Т и Т - некоторые типы и Т - подтип типа Т (не нарушая общности, можно считать, что Т - это непосредственный подтип типа Т). Тогда будут cnpaaezumBbi следующие рассуждения. Типы Т и Т - это, по существу, множества (именованные множества значений), и Т является подмножеством Т. Следовательно, типы Т и Т оба имеют предикаты члена множества, т.е. такие предикаты, что их значения являются членами данного множества (поэтому и значениями данного типа) тогда и только тогда, когда они удовлетворяют данному предикату. Пусть такими предикатами будут соответственно Р и Р. Заметим, что предикат Р по определению при вычислении дает значение истина только для значений из числа действительно относящихся к типу Т. Поэтому он может быть сформулирован не только в терминах значений типа Т, а и в терминах значений типа Т. Именно такой предикат Р, сформулированный в терминах значений типа Т, и является ограничением, которому должны удовлетворять значения типа Т, чтобы фактически являться значениями типа Т. Иными словами, некоторое значение типа Т специализируется именно к типу Т, если оно удовлетворяет ограничению Р. Поэтому мы утверждаем, что специализация по ограничениям является единственным концептуально допустимым средством определения подтипов. Вследствие этого мы не признаем примеров, подобных npezuiaracMOMy, в котором тип COLORED CIRCLE может быть подтипом типа CIRCLE. 19.10. Резюме В этой главе были кратко рассмотрены основные понятия модели наследования типов. Если тип В является подтипом типа А (или, что равносильно, если тип А является супертипом типа В), то каждое значение типа В также является значением типа А. Поэтому операторы и ограничения, которые применимы к значениям типа А, будут также применимы к значениям типа В. Но, кроме того, будут существовать операторы и ограничения, которые применимы к значениям типа В и не применимы к значениям, относящимся лишь к типу А. Мы различили одиночное и множественное наследования (но обсуждали только одиночное наследование), наследование скалярных значений, кортежей и отношений (но рассматривали только наследование скалярных значений) и ввели понятие иерархии типа. Мы также дали определение понятия действительного подтипа или супертипа, непосредственного подтипа или супертипа, корневого и листового типов, а также ввели допущение о несвязанности, согласно которому типы Т1 и Т2 не связаны, если ни один из них не является подтипом другого. Вследствие этого допущения каждое значение имеет уникальный конкретный тип (необязательно листовой). Далее речь шла о концепции включаемого полиморфизма и заменимости значений, причем оба эти понятия логически следуют из основной концепции наследования. Мы различали включаемый полиморфизм (который связан с наследованием) и перегружаемый полиморфизм (который с наследованием не связан). Было показано, как благодаря связыванию во время выполнения включаемый полиморфизм может способствовать повторному использованию кода. Затем обсуждалось влияние наследования на операции присвоения. Основное сделанное нами допушение заключается в том, что никаких преобразований типа не происходит, т.е. значения имеют свои конкретные типы и при их присвоении переменным с менее конкретным объявленным типом. Поэтому переменная объявленного типа Т может иметь значение, конкретный тип которого - один из подтипов типа Т. (Аналогично, если оператор Ор определен с результатом объявленного типа Т, то результат реального вызова оператора Ор может быть значением, конкретный тип которого- это один из подтипов типа Т.) Следовательно, мы моделируем скалярную переменную V или в более общем случае произвольное скалярное выражение, как упорядоченную тройку вида <DT,MST,v>, где DT - объявленный тип, MST - текущий конкретный тип и v - текущее значение. Дополнительно был введен оператор TREAT DOWN, позволяющий выполнять операции, которые в противном случае приводили бы к ошибкам во время компиляции. Это операции с выражениями, конкретный тип которых во время выполнения является подтипом их объявленного типа. (Ошибки во время выполнения по-прежнему могут иметь место, но теперь лишь в контексте оператора TREAT DOWN.) После этого более детально были рассмотрены операторы выбора. Мы убедились, что вызов оператора выбора для типа Т иногда дает в результате значение, тип которого является собственным подтипом типа Т (по крайней мере в нашей модели, хотя в современных коммерческих продуктах этого обычно не наблюдается). Такой механизм получил название специализация по ограничениям. Также подробно обсуждались операторы вида 1!ЕЕ псевдопеременная. Поскольку они представляют собой лишь сокращенную запись, при выполнении оператора присвоения И}{Е псевдопеременная могут существовать как специализация по ограничениям, так и обобщение по ограничениям. Далее рассматривались ситуации, возможные при выполнении сравнения значений подтипов и супертипов, а также при выполнении реляционных операций соединения, объединения, пересечения и разности. Дополнительно было введено несколько операторов проверки типа: IS T, IS MS T и т.д. Затем обсуждались вопросы, касающиеся операторов только для чтения и операторов обновления, версий операторов и сигнатур операторов. При этом было указано, что возможность определять различные версии оператора открывает лазейку для изменения семантики данного оператора (но в нашей модели такие изменения запрещены). И наконец был рассмотрен дискуссионный вопрос Являются ли окружности на самом деле эллипсами? . В результате было сделано заключение, что наследование применимо к значениям, а не к переменным. Точнее, операторы, предназначенные только для чтения (которые применимы к значениям), могут наследоваться все без исключения и без каких-либо проблем, но операторы обновления (которые применимы к переменным) могут наследоваться лишь условно. (Наша модель не соответствует большинству подходов. При иных подходах обычно требуется, чтобы операторы обновления наследовались безусловно, зато после возникает множество проблем, когда приходится иметь
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |