Я все еще оборачиваюсь вокруг Фортрана с " объектно-ориентированным " ароматом.
Можно ли инициализировать переменную в производном типе , и что если я бы хотел, чтобы эта переменная была parameter
?
Например, классический animal
, cat
, bee
набор типов, которые должны определять количество ног каждого животного:
модуль животного
module animal_module
implicit none
type, abstract :: animal
private
integer, public :: nlegs = -1
contains
...
модуль cat
module cat_module
use animal_module, only : animal
implicit none
type, extends(animal) :: cat
private
! error here about redefining nlegs...
integer, public :: nlegs = 4
...
Я нашел в сети ключевое слово initial
, но мой компилятор (Intel) жалуется на ключевое слово с синтаксисомошибка.
Приложение
Я пробовал пользовательский конструктор , но, очевидно, я не могу написать его для производных типов. Это моя попытка, только для типа cat :
module cat_module
use animal_module, only : animal
implicit none
type, extends(animal) :: cat
private
real :: hidden = 23.
contains
procedure :: setlegs => setlegs
procedure :: speak
end type cat
interface cat
module procedure init_cat
end interface cat
contains
type(cat) function init_cat(this)
class(cat), intent(inout) :: this
this%nlegs = -4
end function init_cat
...
program oo
use animal_module
use cat_module
use bee_module
implicit none
character(len = 3) :: what = "cat"
class(animal), allocatable :: q
select case(what)
case("cat")
print *, "you will see a cat"
allocate(cat :: q)
...
print *, "this animal has ", q%legs(), " legs."
Поскольку тип animal
имеет integer, public :: nlegs = -1
, я ожидал, что cat
будет иметь -4
ноги,но увы, это все еще -1
.