Модель языка для предоставленного пользователем конструктора - это универсальная функция с тем же идентификатором, что и тип, которая просто возвращает объект типа.Помимо возможности иметь универсальный объект с тем же именем, что и тип, в этом нет ничего особенного.
module types
implicit none
type mytype
real, allocatable :: someArray(:)
end type mytype
interface mytype
module procedure :: init
end interface
! init would typically be private.
contains
function init()
type(mytype) :: this
allocate( this%someArray(5) )
! Non-pointer function result must be defined.
this%someArray = 0
end function init
end module types
program test
use types
implicit none
type(mytype) :: x
x = mytype()
do i=1, 5
x%someArray(i) = real(i)
print *, x%someArray(i)
end do
end program test
(Пример несколько бессмыслен, учитывая другие аспекты языка, такие как параметризованные типы, конструкторы массивов,автоматическое выделение или даже встроенная возможность встроенных конструкторов структуры.)
Сообщение об ошибке от компилятора, возможно, означает ссылку на общий интерфейс, поскольку оператор процедуры разрешен только винтерфейсный блок для универсального.
Ссылки на определенные привязанные к типу процедуры - вещи с синтаксисом object % binding
- обычно используются, когда у вас есть родительский тип, у которого есть метод с определенной сигнатурой (набор фиктивных аргументов, за исключением переданного аргумента), иВы хотите переопределить этот метод в расширениях, то есть вызвать другую процедуру с такой же сигнатурой.Конструкторам это не подходит - обычно информация, которую нужно передать конструктору (т. Е. Подпись вызова), зависит от типа.