抽象类型(Abstract Type)与同名通用接口(Generic Interface)的关联及接口内过程的作用问询
抽象类型与同名通用接口的关联分析
先直接给结论:在Fortran语言的规则里,抽象类型和与其同名的通用接口之间没有内置的、强制的关联关系——它们是两个完全独立的程序实体,只是恰好被你赋予了相同的名字而已。
我们结合你的两个示例来拆解:
先回顾示例1(可实例化类型的构造器)
在示例1中,你用同名通用接口concrete绑定子程序constructor,这是Fortran里定义类型构造器的标准写法:
MODULE a TYPE:: concrete END TYPE concrete INTERFACE concrete PROCEDURE constructor END INTERFACE concrete CONTAINS SUBROUTINE constructor END SUBROUTINE constructor END MODULE a
这里的同名接口是语言明确规定的:当你尝试用TYPE(concrete) :: obj = concrete(...)的语法创建concrete类型的实例时,编译器会自动查找与类型同名的通用接口,把接口内的过程当作构造器调用。这是语言层面的绑定关系。
再看示例2(抽象类型的同名接口)
但对于抽象类型来说,情况完全不同:
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
抽象类型的本质是不能被直接实例化,所以Fortran语言从根本上就没有为抽象类型定义“构造器”的概念——自然也不存在“同名接口作为构造器”的绑定规则。
这个abstract通用接口和抽象类型abstract的关联,完全是你自己代码逻辑层面的约定:
- 你可以让接口内的
what_am_i子程序接收抽象类型的实例作为参数,或者实现和该抽象类型相关的操作,但这是你手动编写的逻辑,不是语言强制的关联。 - 你甚至可以把这个接口改名为
abstract_utils或者任何其他名字,完全不会影响抽象类型abstract的定义和使用。
额外补充
如果硬要说可能的关联场景,那通常是程序员自己的代码规范:比如用与抽象类型同名的接口来集中存放和该类型相关的工具过程(比如类型检查、转换等),但这只是约定俗成的写法,和Fortran语言本身的规则无关。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

