Производные типы
Презентацию к лекции Вы можете скачать здесь.
Производные типы, зачем ?
! данные N частиц real x(N) real y(N) real z(N) logical status(N) real temperature(N) real pressure(N) integer color(N)
При сортировке используются перестановки элементов.
Перестановка требует 3 операции присваивания.
tmp = x(12) x(12) = x(15) x(15) = tmp
Для перестановки двух частиц потребуется записать 21(!) операции присваивания.
Лучше объединить типы под одним "общим типом".
Оператор type
Объявляет новый тип данных, группируя под одним именем существующие типы.
type имя типы данных contains процедуры привязанные к типу end type имя
Доступ к полям
Операция " . " или " % ".
program prog type NewType integer A real B character C logical D end type NewType type (NewType) PS PS.A = 35; PS.B = 3.14; PS.C = 'E'; PS.D = .FALSE. PS%A = 25; PS%B = 5.67; PS%C = 'Q'; PS%D = .TRUE. end
Задание начальных значений для каждого поля лучше с использованием конструктора.
Конструктор производного типа
Конструктор – функция с именем производного типа.
Параметры функции - поля производного типа.
Иерархия типов
Расширение типа, extends
Тип CHILD наследует поля типа PARENT
type PARENT ! родитель integer A real B end type PARENT type, extends (PARENT) :: CHILD ! потомок character C end type CHILD type (CHILD) pas1, pas2 pas1 = CHILD(PARENT(1,2.0),'A') pas2 = CHILD(1,2.0,'A')
Оператор class
Class объявляет полиморфную переменную.
Если полиморфная переменная не является формальным параметром процедуры, то используются атрибуты allocatable или pointer.
class (имя производного типа), allocatable :: имя
type PARENT integer A real B end type PARENT type, extends (PARENT) :: CHILD ! наследуем тип PARENT character C end type CHILD type (CHILD), allocatable :: CL1 class (CHILD), allocatable :: CL2 allocate(CL1, source = CHILD(1,3.0,'Q')) allocate(CL2, source = CHILD(1,3.0,'Q'))
Переменная CL2 имеет больше возможностей.
Полиморфная переменная объявленная родительским типом может "принимать" все дочерние типы.
program prog type PARENT integer A real B end type PARENT type, extends (PARENT) :: CHILD_A character C end type CHILD_A type, extends (PARENT) :: CHILD_B logical D end type CHILD_B type, extends (CHILD_A) :: CHILD_CHILD_A complex E end type CHILD_CHILD_A class (PARENT), pointer :: PAR type (PARENT), target :: P type (CHILD_A), target :: CA type (CHILD_B), target :: CB type (CHILD_CHILD_A), target :: CCA PAR => P ! стал родителем PAR => CA ! теперь потомок А PAR => CB ! изменился на потомка B PAR => CCA ! теперь потомок потомка А end
Конструкция select type
Как определить какой тип имеет полиморфная переменная ?
Select type позволяет выполнить блок операторов в зависимости от динамического типа полиморфной переменной.
select type (переменная) type is (имя типа) class is (имя типа) class default end select