为什么覆盖过程中的参数名称需要与抽象接口的名称相匹配?
我明白,这些参数的 , 等清楚地TYPE
需要INTENT
匹配接口,但是为什么编译器要关心我所说的变量呢?
在下文中,我定义了一个简单的抽象实用程序类,其中包含一个EVAL
采用双精度参数的延迟过程。
!------------------------------------- an abstract utility class !
type, abstract :: func_1d
contains
procedure(interface_1d),deferred :: eval
end type func_1d
!-------------------------------------------- interface for eval !
abstract interface
function interface_1d(this,data) result(rval)
import :: func_1d
class(func_1d), intent(inout) :: this
real*8 , intent(in) :: data
real*8 :: rval
end function interface_1d
end interface
定义一个覆盖类和一个实现EVAL
:
type, extends(func_1d) :: foo
contains
procedure, pass :: eval => eval_foo
end type foo
function eval_foo(this,another_variable_name) result(rval)
implicit none
class(foo), intent(inout) :: this
real*8, intent(in) :: another_variable_name
real*8 :: rval
!! etc
end function eval_foo
我收到以下错误gfortran
:
错误:(1)处“eval”的虚拟参数“another_variable_name”应命名为“data”,以匹配被覆盖过程的相应参数
如果我改为替换所有内容DATA
,ANOTHER_VARIABLE_NAME
则可以按预期编译和运行。
但这对我来说似乎很愚蠢。我希望能够FUNC_1D
多次继承,并且在各种情况下并且DATA
每次都被迫调用我的变量似乎很荒谬。
我不明白为什么编译器应该对参数感兴趣而不是TYPE
和INTENT
?