Я пишу модуль, который определяет два производных типа, каждый из которых имеет компонент производного типа с общим родительским типом, следующим образом.
type :: aux0
integer :: a
end type aux0
type, extends(aux0) :: aux1
integer :: b
end type aux1
type, extends(aux0) :: aux2
integer :: c
end type aux2
Я хочу определить два производных типа, каждый из которых имеет компонент типа aux1
и aux2
соответственно. У меня есть несколько процедур, которые выполняют некоторую работу исключительно на основе поля aux % a
(например, fun1
). Я хотел бы связать эти методы с cplx1
, cplx2
. Таким образом, я создал общего родителя для cplx1
, cplx2
с полем aux
класса aux0
и написал интерфейс переменных класса aux0
для общих функций. Однако я хотел бы указать тип компонента aux
в фактических типах cplx1
, cplx2
, поскольку для некоторых других функций требуется определенный тип для поля aux
. Мне интересно, как или это выполнимо.
module type
! ... aux# types definitions
type :: cplx0
class(aux0), allocatable :: aux(:)
contains
! routines that use aux % a
procedure, pass :: fun1
end type cplx0
type, extends(cplx0) :: cplx1
! type(aux1) :: aux(:) ! doesn't work
contains
! routines that use aux % b
end type cplx1
type, extends(cplx0) :: cplx2
! type(aux2) :: aux(:)! doesn't work
contains
! routines that use aux % c
end type cplx2
contains
function fun1(self)
class(cplx0) :: self
integer :: i
do i = 1, size(self % aux)
print *, self % aux(i) % a
end do
end function fun1
! ... more functions
end module type
Если я раскомментирую type(aux1)
, ошибка будет
Error: Component ‘aux’ at (1) already in the parent type at (2)
, что понятно, но мне интересно, как ее обойти.