プロシージャをオーバーライドする際の引数の名前が、抽象インタフェースのものと一致する必要があるのはなぜですか?
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
and以外に関心を持つべき理由がわかりません。INTENT