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

1 ... 229 230 231 [ 232 ] 233 234 235 ... 348


Глава 19

Наследование типов

19.1. Введение

в главе 13 уже рассматривались понятия подтипов и супертипов, а точнее- подтипов и супертипов сущностей. Там же отмечалось, что если, например, некоторые служащие являются программистами и все программисты являются служащими, то тип сущности PROGRAMMER можно рассматривать как подтип сущности EMPLOYEE, а тип сущности EMPLOYEE - как супертип сущности PROGRAMMER. Но при этом подчеркивалось, что тип сущности не является типом в каком-либо формальном смысле, в частности поскольку само понятие сущность определено довольно нестрого. В этой главе мы познакомимся с понятиями подтипов и супертипов поближе, но термин тип будем употреблять в более формальном и точном смысле, как в главе 5. Поэтому начнем с точного определения рассматриваемого термина.

Тип - это именованное .множество значений (т.е. все возможные значения рассматриваемого типа) вместе со связанным множеством операторов, которые могут применяться для значений и переменных данного типа.

Кроме того, добавим следующее.

Любой конкретный тип является либо системно определенным, либо пользовательским.

В определении любого конкретного типа указывается множество всех допустимых его значений (для этого, безусловно, используются ограничения типа, как указывалось в главе 8).

Значения типа могут быть сколь угодно сложными.

Реальное или физическое представление каждого значения всегда скрыто от пользователя, т.е. типы отличаются от их реального представления. Однако каждый тип имеет хотя бы одно воз.можное представление, которое явно доступно пользователю через соответствующие операторы ТНЕ или их эквиваленты.

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

К числу таких операторов, кроме упомянутых операторов ТНЕ , относятся следующие операторы.

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



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

в) Оператор присвоения, позволяющий присвоить некоторое значение данного типа переменной, которая рассматривается как переменная данного типа.

г) Определенные операторы проверки типа, которые будут рассмотрены в разделе 19.6.

Замечание. Эти операторы могут оказаться ненужными, если отсутствует поддержка наследования.

Ко всему сказанному выше необходимо добавить следующее.

Одни типы могут являться подтипами других супертипов. Если В - это подтип типа А, то все операторы и ограничения типа, которые применимы к типу А, также применимы к типу В (наследование), но тип В в этом случае имеет еще и собственные операторы и ограничения типа, которые не применимы к типу А.

Например, предположим, что заданы два типа, ELLIPSE (Эллипс) и CIRCLE (Окружность), понимаемые в их обычном толковании. Тогда можно сказать, что тип CIRCLE- это подтип типа ELLIPSE (а тип ELLIPSE- это супертип типа CIRCLE). При этом подразумевается следующее.

Каждая окружность является эллипсом (т.е. множество всех окружностей является подмножеством всех эллипсов), однако обратное утверждение неверно.

Следовательно, каждый оператор, который применим к эллипсам вообще, безусловно, применим и к окружностям (поскольку окружности являются эллипсами), однако обратное утверждение неверно. Например, оператор THE CTR (Определить центр) можно применять ко всем эллипсам, а значит, и к окружностям, но оператор THE R (Определить радиус) можно применять только к окружностям.

Кроме того, любое ограничение, которое применимо к эллипсам вообще, применимо и к окружностям в частности (опять же, поскольку окружности являются эллипсами), однако обратное утверждение неверно. Например, если эллипсы подчиняются ограничению а > b (где а и Ь - его большая и малая полуоси соответственно), то же самое ограничение должно выполняться и для окружностей. Известно, что для окружностей полуоси а и Ь совпадают с радиусом г, а значит, указанное ограничение удовлетворяется тривиально, т.е. для окружностей на самом деле применимо более строгое ограничение а = Ь. Однако это ограничение не удовлетворяется для всех эллипсов в общем случае.

Замечание. Везде в этой главе не уточненный дополнительно термин ограничение будет использоваться для обозначения именно ограничения типа. Кроме того, термины радиус и полуось здесь означают то, что точнее было бы назвать длиной радиуса или полуоси.

Таким образом, говоря нестрого, тип CIRCLE наследует операторы и ограничения от типа ELLIPSE, а также имеет собственные операторы и ограничения, которые не применимы к типу ELLIPSE. Обратите внимание, что подтип имеет подмножество значений, но в то же время - и супер.множество свойств (этот аспект иногда служит источником путаницы!).

Замечание. Здесь и далее в этой главе под термином свойства мы будем подразумевать удобное сокращение для совокупности операторов и ограничений .



Почему используется наследование типов

Почему тема наследования типов заслуживает отдельного рассмотрения? Имеется по меньшей мере два ответа на этот вопрос.

Во-первых, идеи выделения подтипов и наследования весьма широко распространены в реальном мире, т.е. нет ничего необычного в такой ситуации, когда все значения типа имеют определенные свойства вообще и в то же время некоторое подмножество этих значений имеет собственные дополнительные специфические свойства. Поэтому выделение подтипов и использование механизма наследования представляются вполне полезными инструментами моделирования реальности (или семантического моделирования, как мы называли его в главе 13).

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

К сожалению, эти потенциальные возможности, как мы сейчас убедимся, не находят единодушной поддержки, поскольку нет единого мнения относительно формальной, строгой и абстрактной модели наследования типов, подтверждением чему может служить следующее высказывание из [19.10].

Основная идея наследования довольно проста... [тем не менее, несмотря на] ее ведущую роль в современных... системах, наследование- еще довольно спорный .меха-нщм... [Какого-либо] исчерпывающего представления о наследовании пока нет.

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

Предварительные замечания

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

Значения имеют тип

Воспользуемся рассуждениями из главы 5. Если v - некоторое значение, то его можно представить как помеченное неким флажком значение с надписью Я - целое , Я - номер поставщика , Я - окружность и т.д. Поэтому при отсутствии наследования каждое значение будет относиться строго к одному типу. При использовании наследования значение может относиться к нескольким типам одновременно, т.е. иметь тип ELLIPSE и CIRCLE в одно и то же время.



1 ... 229 230 231 [ 232 ] 233 234 235 ... 348

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