У меня есть тип для связанных списков в Fortran. Это довольно бесполезно, за исключением демонстрации связанных списков. Я надеюсь извлечь из него тип, который я смог бы найти для себя полезным. Мой базовый класс - link
, а мой производный класс - useful_link
. link
ничего не делает, кроме как создает новый link
и получает указатель на эту ссылку. Мое намерение состоит в том, что useful_link
создаст новый useful_link
, а также передаст некоторые полезные данные для его нового создания. (И, как вы можете догадаться, сделайте кучу других вещей, которые у меня нет времени или места для обсуждения.) Мой первый шаг при написании кода:
module links
type link
type(link), pointer :: child => null()
contains
procedure :: reproduce
end type link
contains
subroutine reproduce(this, child_ptr)
class(link) :: this
class(link), pointer :: child_ptr
allocate(this%child)
child_ptr => this%child
end subroutine reproduce
end module links
module useful_links
use links
type, extends(link) :: useful_link
real*8 :: dataval
contains
procedure :: reproduce_w_data
end type useful_link
contains
subroutine reproduce_w_data(this, child_ptr, dataval)
class(useful_link) :: this
class(useful_link), pointer :: child_ptr
call this%link%reproduce(child_ptr) ! <--- problem!
child_ptr%dataval = dataval
end subroutine reproduce_w_data
end module useful_links
Это не компилируется. gfortran говорит мне: «Ошибка: фактический аргумент для« child_ptr »... должен иметь тот же объявленный тип», и проблема в вызове reproduce
в подпрограмме reproduce_w_data
. Кроме того, если я переписываю код для удаления аргументов child_ptr
и пытаюсь присвоить dataval
новой ссылке с помощью
this%child%dataval = dataval
тогда gfortran скажет мне, что "dataval" ... не является членом структуры "link". Ну, это все имеет смысл, но, безусловно, есть какой-то способ сделать эту работу. Кто-нибудь знает, что это такое?
Кстати, я видел примеры, в которых используется конструкция select type
, но это ужасно громоздко, и, если я это понимаю, мне придется каждый раз добавлять новый параметр к reproduce
в типе link
. добавлен новый тип наследования, который, как мне кажется, победил одну из целей ООП. Я прав в этом? Я довольно новичок в ООП в Фортане.
Наконец, кто-нибудь может порекомендовать хорошую ссылку на это? Кажется, есть много людей, которые хорошо знают этот материал, но я не могу найти место, где все это собрано в одном месте.