|
Программирование >> Хронологические базы данных
1. Предполагается, что тип CIRCLE является подтипом типа ELLIPSE. 2. Предполагается, что утверждение, согласно которому тип CIRCLE является подтипом типа ELLIPSE, подразумевает, что операции, которые применимы к эллипсам вообще, применимы (т.е. наследуются), в частности, и к окружностям. 3. Однако сейчас мы требуем, чтобы операции присвоения для операторов ТНЕ А и ТНЕ В не наследовались. Нет ли здесь противоречия? Что же произошло? Прежде чем попытаться ответить на эти вопросы, подчеркнем серьезность данной проблемы. Если определенные операторы не наследуются типом CIRCLE от типа ELLIPSE, то что мы имеем в виду, когда говорим, что окружность является эллипсом? Что означает наследование , если некоторые операторы на самом деле не наследуются? Существует ли действительно гибкая модель? Или же мы гоняемся за призраком, пытаясь его поймать? Замечание. Некоторые авторы даже предлагают, причем вполне серьезно, применять оператор присвоения ТНЕ А как ддя окружностей, так и ддя эллипсов (для окружностей обновляется радиус), а оператор присвоения ТНЕ В - только для эллипсов. Но тогда тип ELLIPSE фактически должен стать подтипом типа CIRCLE! Иными словами, мы получим перевернутую иерархию типов. Но достаточно хоть на минуту задуматься, чтобы понять, что это неудачная идея, в частности концепция заменимости в этом случае будет разрушена (что такое радиус обычного эллипса?). Одних авторов рассуждения, аналогичные рассмотренным выше, приводят к выводу, что гибкой модели наследования не существует (см. аннотацию к [19.1] в разделе Список литературы в конце главы). Другие же авторы пpezлaгaют модели наследования, свойства которых нелогичны или весьма сомнительны. Например, в языке SQL3 разрешены некруглые окружности и другие нелепости. Как и язык SQL/92, язык SQL3 фактически не поддерживает ограничений типа, и это большое упущение, в первую очередь, приводит к тому, что подобные нелепости имеют место (см. приложение Б). Решение проблемы Исходя из сказанного выше можно сделать вывод, что мы столкнулись со следующей дилеммой. Если окружности наследуют операторы присвоения ТНЕ А и ТНЕ В от эллипсов, мы получим некруглые окружности. Чтобы предотвратить возникновение некруглых окружностей, необходима поддержка ограничений типа. Но, если мы поддерживаем ограничения типа, операторы не могут быть наследуемыми. Таким образом, в результате никакого наследования вовсе не может быть! Как же решить эту дилемму? Выход заключается (как это часто бывает) в необходимости осознать (и соответственно действовать), что существует значительное логическое различие между значениями и переменными. Говоря Каждая окружность является эллипсом , мы подразумеваем, что значение каждой окружности является значением эллипса. Мы, безусловно, не считаем при этом, что каждая переменная окружности является некоторой переменной эллипса (переменная объявленного типа CIRCLE не является переменной объявленного типа ELLIPSE, и она не может содержать значение конкретного типа ELLIPSE). Иначе говоря, наследование применимо к значениям, а не к переменным. В случае эллипсов и окружностей, например, можно сформулировать следующие правила. Как уже отмечалось, значение каждой окружности является значением эллипса. Следовательно, все операции, которые применимы к эллипсу, применимы и к окружности. Единственное, чего мы не можем делать по отношению к любым значениям, - это изменять их! Если бы это было возможно, они бы перестали быть значениями. (Конечно, можно изменить текущее значение переменной путем ее обновления, но, повторяем, мы не можем изменить значение как таковое.) Операции, которые применимы к значениям эллипса, все без исключения являются операциями, определенными для типа ELLIPSE и предназначенными лишь для чтения. А операции, которые обновляют переменные типа ELLIPSE, представляются, конечно, операторами обновления, определенными для этого типа. Следовательно, наше утверждение, что наследование применимо к значениям, а не к переменным , точнее можно сформулировать так. Операторы, предназначенные лишь для чтения, наследуются с помощью значений, в том числе с помощью текущих значений переменных. Поэтому данные операторы могут быть применены без каких-либо нежелательных последствий к значениям, которые являются текущими значениями переменных. Эта более точная формулировка также объясняет, почему концепции полиморфизма и заменимости относятся именно к значениям, а не к переменным. Напомним, что в соответствии с концепцией заменимости везде, где системой должно обрабатываться значение типа Т, вместо него можно подставить значение типа Т, если тип Т - подтип типа Т. И именно этот принцип рассматривался, когда мы впервые представляли его как принцип заменимости значений. А как же тогда быть с операторами обновления? По определению такие операторы применимы к переменным, но не к значениям. Можем ли мы тогда сказать, что операторы, которые применимы к переменным типа ELLIPSE, наследуются и переменными типа CIRCLE? Нет, в целом, этого сказать нельзя. Например, оператор присвоения THE CTR применим к переменным обоих объявленных типов, но, как мы уже убедились, оператор присвоения ТНЕ А к ним не применим. Таким образом, наследование не распространяется на операторы обновления, точнее - наследуемые операторы обновления должны указываться явно. Рассмотрим пример. Переменные объявленного типа ELLIPSE имеют операторы обновления MOVE (версия обновления) и операторы присвоения ТНЕ А, ТНЕ В и THE CTR. Переменные объявленного типа CIRCLE имеют операторы обновления MOVE (версия обновления) и операторы присвоения THE CTR и THE R, но не ТНЕ А и ТНЕ В. Замечание. Оператор MOVE рассматривался в предыдущем разделе. Безусловно, в случае, когда наследуется и оператор обновления, мы имеем дело с таким видом полиморфизма и таким видом заменимости, которые применимы также к переменным, а не только к значениям. Например, если для версии обновления оператора MOVE в качестве аргумента может быть подставлена переменная объявленного типа ELLIPSE, можно обратиться к этому оператору и с аргументом, который представляет переменную объявленного типа CIRCLE. Следовательно, можно (и нужно) говорить о принципе заменимости переменных, но при этом не забывать, что данный принцип более ограниченный по сравнению с принципом заменимости значений. 19.9. Пересмотр специализации ограничением Продолжая начатое в предыдущем разделе обсуждение, рассмотрим небольшое, но существенное дополнение. Обратимся к следующему примеру: Пусть тип CIRCLE имеет собственный подтип COLORED CIRCLE (Цветная окружность) . При этом подразумевается, что цветные окружности являются частным случаем окружностей вообще. Примеры такого рода весьма распространены в литературе. До сих пор мы говорили, что считаем их крайне неубедительными и даже в некотором отнощений вводящими в заблуждение. Если говорить конкретно, то в данном случае, по нашему мнению, не имеет смысла рассматривать цветные окружности как отдельный случай окружностей в целом. В конце концов, цветные окружности по определению должны быть изображениями, например, на экране дисплея, в то время как окружности вообще представляют собой геометрические фигуры, а не изображения. Поэтому представляется более разумным считать тип COLORED CIRCLE не подтипом типа CIRCLE, а совершенно самостоятельным типом. Такой независимый тип мог бы иметь возможное представление, в котором один компонент имел бы тип CIRCLE, а другой - тип COLOR, но, повторяем, он ни в коем случае не являлся бы подтипом типа CIRCLE. Наследование возможных представлений Рассмотрим конкретные аргументы в пользу нашей позиции по предыдущему вопросу. Возвратимся на некоторое время к уже знакомому нам примеру с эллипсами и окружностями. Еще раз приведем сокращенные определения типов. TYPE ELLIPSE POSSREP ( А LENGTH, В LENGTH, CTR POINT ) ... ; TYPE CIRCLE POSSREP ( R LENGTH, CTR POINT ) ... ; Обратите внимание, что эллипсы и окружности имеют различные объявляемые возможные представления. Однако возможное представление для эллипсов является - обязательно, хотя и неявно - возможным представлением и для окружностей, поскольку окружности являются эллипсами. Таким образом, окружности могут возможно, представляться своими полуосями а и b (и центром), хотя на самом деле их полуоси будут равны одному и тому же значению. Обратное, конечно, не верно, т.е. возможное представление для окружностей не обязательно является возможным представлением для эллипсов. Отсюда следует, что мы могли бы считать возможные представления и ограничения дополнительными свойствами , которые наследуются окружностями от эллипсов или, гово-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |