考虑以下代码:
MODULE a
TYPE:: concrete
END TYPE concrete
INTERFACE concrete
PROCEDURE constructor
END INTERFACE concrete
CONTAINS
SUBROUTINE constructor
END SUBROUTINE constructor
END MODULE a
据我所知,在这种情况下,通用接口concrete
将类型concrete
的构造函数声明为子例程constructor
(这是我所知道的声明构造函数的唯一方法)。现在考虑下面的代码:
MODULE a
TYPE, ABSTRACT:: abstract
END TYPE abstract
INTERFACE abstract
PROCEDURE what_am_i
END INTERFACE abstract
CONTAINS
SUBROUTINE what_am_i
END SUBROUTINE what_am_i
END MODULE a
这里,我有一个抽象类型和具有相同名称的泛型接口,但是根据定义,抽象类型abstract
不能有构造函数。
所以我的问题是:抽象类型,具有相同名称的泛型接口和该接口内的过程(在示例中,子程序what_am_i
)之间是否存在任何关系?如果有,是什么?
类型abstract
与泛型abstract
之间的关系与类型concrete
与泛型concrete
之间的关系完全相同。
这种关系简单地说就是"它们具有相同的名称"。尽管与类型同名的泛型函数可以被视为构造函数,但它没有真正的特权地位。
派生类型的定义意味着默认的结构构造函数具有与派生类型相同的名称,因此
type t
integer i
end type t
type(t) x
x = t(1)
end
给出了该类型的对象x
,并具有期望值。
如果x=t(1)
可以解析为特定的函数f
,则可以将该函数f
称为构造函数,如果它的函数result是t
类型的对象。
但是f
没有任何理由必须返回t
类型的对象。考虑
module mod
implicit none
type t
end type t
interface t
module procedure f
end interface t
contains
function f()
integer f
f = 1
end function f
end module mod
use mod
implicit none
print *, t()
end
在这里很难将f
称为构造函数。
就是这样:在泛型abstract
下没有特定的函数可以返回构造的abstract
对象,但每个函数都可以返回其他东西。正如泛型concrete
下的特定函数可以返回非concrete
类型的东西。