具有相同名称的抽象类型和泛型接口之间的关系



考虑以下代码:

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类型的东西。

相关内容

  • 没有找到相关文章

最新更新