抽象类型与同名泛型接口的关系

Relationship between abstract type and generic interface with the same name

考虑以下代码。

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 类型和一个同名的泛型接口,但根据定义,抽象类型 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 一个构造函数,如果它有函数结果一个类型的对象 t.

但根本没有理由 f 必须 return 类型为 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 下的特定函数不能 return 构造的 abstract 对象,但每个函数都可以 return 其他东西。正如泛型 concrete 下的特定函数可以 return 不是 concrete.

类型的东西