Книга: Основы объектно-ориентированного программирования
Операции над сущностями родового типа
Операции над сущностями родового типа
В родовом классе C [G, H, ...] рассмотрим сущность, чей тип - один из формальных родовых параметров, например x типа G. Когда класс используется клиентом для объявления сущностей, G, разумеется, может представлять любой тип. Поэтому любая операция, которую выполняют подпрограммы C над x, должна быть применима ко всем типам. Это ограничение позволяет выполнять только пять видов операций:
Использование сущностей формального родового типа
Корректно использовать сущность x, чей тип задан формальным родовым параметром G, можно следующим образом.
1 Слева от оператора присваивания x := y, где выражение y также имеет тип G.
2 Справа от оператора присваивания y := x, где сущность y также типа G.
3 В логических выражениях вида x = y или x /= y, где y также типа G.
4 Как фактический аргумент в вызове подпрограммы на месте формальных параметров типа G, или типа ANY.
5 Как цель вызова компонента класса ANY.
В частности, инструкция создания вида create x неприменима, так как нам ничего неизвестно о процедурах создания, если таковые есть, для класса, определенного возможным фактическим родовым параметром, соответствующим G.
Случаи (4) и (5) ссылаются на класс ANY. Упомянутый уже несколько раз, этот класс содержит компоненты, наследуемые всеми классами. Поэтому можно быть уверенным, что независимо от фактического типа G при родовом порождении компоненты будут доступны. Компонентами класса ANY являются все основные операции копирования и сравнения объектов: clone, copy, equal, deep_clone, deep_equal и др. Поэтому для x и y формального родового типа G корректно использовать следующие инструкции:
x.copy (y)
x := clone (y)
if equal (x, y) then ...
Случай (4) разрешает вызов a.f(x) в родовом классе C [G], если f имеет формальный аргумент типа G. В частности, возможна ситуация, когда a может быть типа D [G], где D другой родовой класс. В классе D [G] объявлен компонент f, требующий аргумент типа G, обозначающий в этом случае формальный родовой параметр класса D, а не класса С. (Если предыдущая фраза не совсем понятна, перечитайте ее еще раз, и, надеюсь, она покажется столь же прозрачной10.2), как горный ручей.)
- Восстановление "безнадежных" баз данных. InterBase Surgeon
- Что делать, если при установке принтера появляется сообщение Невозможно завершение операции. Подсистема печати недоступн...
- Надежность и безопасность
- Использование CAST() с типами дата
- 2.5. Разработка технического задания на проведение детального анализа рынка при работе над инновационным проектом. Основ...
- Операции с множествами узлов
- 4. Null-значения и логические операции
- 1. Операции объединения, пересечения, разности
- 2. Операции декартового произведения и естественного соединения
- 5. Производные операции
- 2. Унарные операции на языке структурированных запросов
- 3. Бинарные операции на языке структурированных запросов