如何使用接口块进行类型重载

How to use interface block for type overloading

我写了一个 Fortran 代码来读取不同的文本文件。每个文本文件都有自己的类型,它定义了从定义一般操作的抽象类型继承的读取过程:

module FileImporter_class
implicit none
private
type, abstract, public :: FileImporter
.
.
contains
    procedure, public :: ProcessFile
.
.
end type FileImporter
contains
.
.
subroutine ProcessFile(self,FileName)
implicit none
    ! Declaring Part
    class(FileImporter) :: self
    character(len=*) :: FileName

    ! Executing Part
    call self%SetFileName(FileName)
    call self%LoadFileInMemory
    call self%ParseFile
end subroutine ProcessFile
end module FileImporter_class

继承class:

module optParser_class
use FileImporter_class
implicit none
type, public, extends(FileImporter) :: optParser
.
. 
contains
    procedure, public :: ParseFile
end type optParser
interface optParser
    procedure ProcessFile
end interface
contains
.
.
end module optParser_class

我的问题是关于接口块。我想通过简单地调用类型来调用过程 ProcessFile,所以 call optParser('inputfile.txt')。显示的这个变体给出了编译错误(ProcessFile 不是函数也不是子例程)。我可以通过在 optParser_class 模块中放置一个 ProcessFile 函数来解决这个问题,但是我必须为每个继承 class 执行此操作,我自然希望避免这种情况。有什么建议如何做到这一点?

Fortran 标准不允许将子例程放入重载类型名称的接口块中。

只能将函数放入此类接口中,然后它们通常用于 return 该类型的对象(构造函数或初始化程序)。

相反,您应该将其称为类型绑定过程,因为 optParserFileImporter 继承自

 call variable_of_optParser_type%ProcessFile('inputfile.txt')

没有类似 Python 的类方法可以在 Fortran 中调用而无需实例。注意 ProcessFileself 参数,所以它 必须 接收一些对象实例。

顺便说一句,我建议您制定一个约定,无论您的字体以小写字母还是大写字母开头并坚持使用以避免混淆。