Наследование производных типов Фортрана

Допустим, у меня есть производный тип bar_a, который включен в производный тип foo_a как переменная bar.
Теперь я хочу расширить bar_a и создать новый производный тип с именем bar_b. Я пробовал следующее:

program main
  implicit none

  ! Base types -----------
  
  type :: bar_a
    integer :: a
  end type bar_a
  
  type :: foo_a
    type(bar_a) :: bar
  end type foo_a
  
  ! Extended types -------
  
  type, extends(bar_a) :: bar_b
    integer :: b
  end type bar_b
  
  type, extends(foo_a) :: foo_b
    type(bar_b) :: bar ! <-- Component ‘bar’ at (1) already in the parent type
  end type foo_b
  
  ! ----------------------

  type(foo_b) :: foo

  print *, foo%bar%a
  print *, foo%bar%b

end program main

но я получаю ошибку компилятора: компонент «бар» в (1) уже в родительском типе.

Есть ли способ расширить foo_a, чтобы он включал новый производный тип bar_b, как я пытался, или есть ли способ переопределить объявление переменной bar? Я хотел бы унаследовать связанные с типом процедуры, которые будут частью foo_a в foo_b.


person jcerar    schedule 01.02.2021    source источник


Ответы (1)


Когда я пытаюсь скомпилировать, я получаю лучшее сообщение:

aa.f90:21:22:

   10 |   type :: foo_a
      |               2
......
   21 |     type(bar_b) :: bar ! <-- Component ‘bar’ already in the parent type
      |                      1
Error: Component ‘bar’ at (1) already in the parent type at (2)

и это кажется логичным: вы пытаетесь расширить foo_a элементом с именем bar, но тип, который вы расширяете (из определения в строке 10), уже имеет переменную bar в строке 11, и вы пытаетесь добавить еще bar в строке 21.

person albert    schedule 01.02.2021
comment
Есть ли способ переопределить объявление? В моем случае я хотел бы передать связанные с типом процедуры, которые были бы частью foo_a, в foo_b. - person jcerar; 01.02.2021
comment
Это другой вопрос, и вы должны четко указать это в своем вопросе (отредактировать текущий или задать новый вопрос), мой ответ был основан на том, что было задано. - person albert; 02.02.2021
comment
Мне жаль. Я коряво сформулировал вопрос. Я отредактировал вопрос, чтобы быть более ясным. - person jcerar; 02.02.2021