Укажите полиморфный компонент в расширенном типе Фортрана - PullRequest
0 голосов
/ 11 ноября 2019

Я пишу модуль, который определяет два производных типа, каждый из которых имеет компонент производного типа с общим родительским типом, следующим образом.

   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)

, что понятно, но мне интересно, как ее обойти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...