Опубликован: 18.12.2012 | Доступ: свободный | Студентов: 272 / 55 | Длительность: 03:25:00
Лекция 2:

Производные типы

< Лекция 1 || Лекция 2: 12 || Лекция 3 >
Аннотация: Лекция посвящена созданию и использованию производных типов данных, элементам объектно-ориентированного стиля программирования. Рассказывается о процедурных указателях, перегруженных и задаваемых операциях, наследовании типов, полиморфных переменных. Рассматриваются операторы class, select type, атрибуты pass и nopass.

Презентацию к лекции Вы можете скачать здесь.

Производные типы, зачем ?

! данные 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
    
< Лекция 1 || Лекция 2: 12 || Лекция 3 >