next up previous contents
След.: Инкапсуляция Выше: Полиморфизм Пред.: Полиморфные переменные и процедуры   Содержание


Конструкция выбора типа

Доступ возможен только к полям и связанным процедурам (см. ниже) объявленного типа. Однако можно расширить доступ с помощью конструкции SELECT TYPE. Она похожа на SELECT CASE -- выполняет не более одного блока кода в зависимости от динамического типа выражения-селектора. Выражению можно придать имя так же, как в конструкции ASSOCIATE. Синтаксис:

[имя:]SELECT TYPE ([ассоц=>] селектор)

проверка типа

блок

...

END SELECT [имя]

Здесь ассоц -- ассоциированное имя для селектора. Оно должно быть и может быть опущено только если селектор -- переменная (тогда ее имя является ассоциированным). Если селектор -- не переменная или переменная с векторным индексом, ассоциированное имя не может изменяться в блоках (например, быть в левой части присваивания, фактическим исходящим аргументом процедуры и т.п.). Селектор должен быть полиморфным.

проверка типа имеет вид

TYPE IS(тип) [имя]

или

CLASS IS(тип) [имя]

или

CLASS DEFAULT [имя]

Имя совпадает с именем конструкции. За исключением абсолютно полиморфного селектора, тип должен быть расширением типа селектора, указанного при объявлении. Тип и его разновидности не могут быть указаны более, чем по одному разу в TYPE IS и CLASS IS в пределах одной конструкции. Блок CLASS DEFAULT может быть не более, чем один в конструкции.

Сначала вычисляются все выражения в селекторе. В зависимости от его динамического типа выполняется не более, чем один блок кода. Ассоциированное имя означает результат вычисленного селектора и может использоваться в блоке.

Проверка типа TYPE IS успешна, если динамический тип селектора и разновидности его типа совпадают с теми, что указаны. Проверка типа CLASS IS успешна, если тип селектора расширяет указанный тип, а разновидности типа те же.

Если успешна проверка типа TYPE IS, выполняется ее блок кода. Если таковой нет, но успешна ровно одна проверка типа CLASS IS, выполняется ее блок кода. Если их больше одной, выбирается та, тип которой есть потомок всех остальных. Если нет успешных проверок типа, выполняется блок CLASS DEFAULT, если он есть, или ничего не выполняется.

В блоке TYPE IS ассоциированное имя не полиморфно, имеет тип, указанный в проверке,и и разновидности типа селектора. В блоке CLASS IS оно полиморфно, причем объявленный тип совпадает с указанным в проверке и разновидности типа селектора. В блоке CLASS DEFAULT оно тоже полиморфно, причем объявленный тип и его разновидности такие, как у селектора.



Ilya A. Chernov 2012-12-19
X