抽象类型与同名泛型接口的关系
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
.
类型的东西
考虑以下代码。
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
.