如何使用接口块进行类型重载
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 该类型的对象(构造函数或初始化程序)。
相反,您应该将其称为类型绑定过程,因为 optParser
从 FileImporter
继承自
call variable_of_optParser_type%ProcessFile('inputfile.txt')
没有类似 Python 的类方法可以在 Fortran 中调用而无需实例。注意 ProcessFile
有 self
参数,所以它 必须 接收一些对象实例。
顺便说一句,我建议您制定一个约定,无论您的字体以小写字母还是大写字母开头并坚持使用以避免混淆。
我写了一个 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 该类型的对象(构造函数或初始化程序)。
相反,您应该将其称为类型绑定过程,因为 optParser
从 FileImporter
继承自
call variable_of_optParser_type%ProcessFile('inputfile.txt')
没有类似 Python 的类方法可以在 Fortran 中调用而无需实例。注意 ProcessFile
有 self
参数,所以它 必须 接收一些对象实例。
顺便说一句,我建议您制定一个约定,无论您的字体以小写字母还是大写字母开头并坚持使用以避免混淆。