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

Полиморфные переменные и процедуры

Полиморфные переменные -- это переменные, тип которых определяется на этапе выполнения. Они объявляются с помощью слова CLASS и могут быть указателями, размещаемыми или формальными аргументами. При этом тип определяется при связи указателя с целью, размещении или по фактическому аргументу соответственно. При размещении тип определятся спецификатором SOURCE (вместе со значением) или MOLD (только тип). Например,

CLASS(SHAPE), POINTER:: SH

Здесь SH -- указатель на переменную типа SHAPE или любого из его потомков. Запись CLASS(*) определяет абсолютно полиморфный объект, тип которого может быть любым. Это удобно для разработки, например, справочных функций, которые должны работать с объектами любых, в том числе заренее неизвестных, типов. При размещении размещаемых объектов и указателей абсолютно полиморфного типа необходимо указывать источник посредством спецификатора SOURCE или MOLD.

Формальный аргумент, который не размещаемый и не указатель, должен быть совместим по типу с фактическим аргументом, то есть фактический аргумент должен быть того же типа или расширенного типа. Это позволяет передавать процедуре Fortran-95 аргумент расширенного типа вместо того, который предусмотрен разработчиком -- расширения просто игнорируются. А размещаемый аргумент или аргумент-указатель должен иметь тот же тип, что и фактический аргумент, и если один из них полиморфный, то и другой тоже должен быть полиморфным. Формальный аргумент с атрибутом PASS (см. ниже) должен быть полиморфным. Если же фактический аргумент полиморфный с коиндексом, то формальный не должен быть полиморфным.

При присваивании правая часть может быть полиморфным объектом. При этом тип правой части должен расширять тип левой. При присваивании указателю он должен быть совместим по типу с целью и с теми же разновидностями типа. Если указатель полиморфный, он получает тип цели.

Встроенные функции SAME_TYPE_AS(A,B) и EXTENDS_TYPE_OF(A,MOLD) позволяют определить, один ли динамический тип у аргументов и расширяет ли динамический тип A динамический тип MOLD.

Например [26]:

SUBROUTINE SETCOLOR(SH, COLOR)

CLASS(SHAPE) :: SH

INTEGER :: COLOR

SH%COLOR = COLOR

END SUBROUTINE SETCOLOR

Первый аргумент полиморфный -- фактическим может быть объект того же типа или типа-потомка.



Ilya A. Chernov 2012-12-19
X