Раздел 12.5 - Ссылочные параметры (при объектной ориентации)
Часто при создании объектно-ориентированных систем
необходимо передавать ссылки на тэговые типы
(о тэговых типах мы говорили в Уроке 7).
С целью облегчения разработки ОО-систем
с использованием ссылочных типов, в Ada 95 был добавлен новый псевдо-режим
передачи параметров, называемый "ссылочным".
Напомним, что каждый параметр, может быть передан подпрограмме в одном из трех
режимов передачи:
in, in out, или out.
Вместо этого для задания режима передачи параметра можно использовать
ключевое слово "access" с именем типа.
Например:
procedure Get(Agent : access Occupant; Direct_Object : access Occupant'Class);
Как же понимать этот пример??
Ответ звучит следующим образом:
-
Когда за "ссылочным режимом" следует обычный тэговый тип,
то это значит, что входной параметр (в нашем случае Agent) должен
быть ссылочным значением на объект данного типа (в нашем случае Occupant).
Но самое главное - эта процедура может быть переопределена, и
ее вызов будет диспетчеризирован к соответствующей подпрограмме
объекта того типа, на который передается ссылка.
Таким образом, можно создать другую подпрограмму с именем "Get"
для наследника типа Occupant, и эта подпрограмма переопределит
приведенную выше. Возможность диспетчеризации к нужной подпрограмме,
в зависимости от значения некоторой переменной, является
необходимым свойством объектно-ориентированного языка. Ссылочные параметры
делают возможной диспетчеризацию на основе ссылочных значений.
-
Когда за "ссылочным режимом" следует классовый тип,
то это значит, что входной параметр (в нашем случае Direct_Object) должен
быть ссылочным значением на объект данного типа (в нашем случае Occupant) или
любого типа, унаследованого от него.
В этом случае диспетчеризация не происходит, так как объекты
всех унаследованных типов подходят в качестве параметра этой подпрограммы,
то есть ссылочный параметр может принимать набор определенных типов, а не
какой-то конкретный ссылочный тип.
Существует важное правило использования ссылочных параметров: они не могут принимать
пустые значения (null). Если все же необходимо разрешить передачу пустых значений,
нужно использовать режимы in, out или in out с обычным ссылочным типом.
Может быть сложно разобраться в ссылочных параметрах без более конкретных
примеров, поэтому мы отложим дальнейшее обсуждение до
Урока 18, где будут рассмотрены примеры их
использования.
Тем не менее, Вы уже должны были понять, что при использовании ссылочных
типов при объектно-ориентированном программировании, скорее всего Вам понадобится
псевдо-режим передачи параметров "access".
Упражнение:
Имеется следующее описание процедуры:
procedure Jump(E : access Occupant'Class);
Произойдет ли диспетчеризация вызова процедуры Jump к одной из нескольких
других подпрограмм, в зависимости от конкретного типа "E"?
- Да, вызов Jump будет динамически диспетчеризирован.
- Нет, вызов Jump не будет динамически диспетчеризирован.
Вы можете также:
David A. Wheeler (dwheeler@ida.org)
Перевод: Юрий Королев
Общая редакция перевода: Г.Ю. Сисюк
Исходная копия этого документа находится по адресу
"http://www.adahome.com/Tutorials/Lovelace/s12s5.htm".
Исходная копия перевода размещена на сайте http://www.ada-ru.org