Производные типы
Презентацию к лекции Вы можете скачать здесь.
Производные типы, зачем ?
! данные 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



