现代Fortran:从后代调用祖先过程 [英] Modern Fortran: Calling an ancestor procedure from descendent
问题描述
我开始使用Modern Fortran的OO功能,并且已经熟悉其他语言的OO.在Delphi(对象Pascal)中,通常在其重写后代过程中调用过程的祖先版本,甚至有继承"的语言声明也允许这种情况.我找不到等效的Fortran构造-但可能正在寻找错误的东西.请参阅下面的简单示例.任何建议,不胜感激.
I am starting to use the OO features of Modern Fortran and am already familiar with OO in other languages. In Delphi (Object Pascal) it is common to call an ancestor version of a procedure in its overridden descendent procedure and there is even a language statement "inherited" that allows this. I can't find an equivalent Fortran construct - but am probably looking for the wrong thing. See simple example below. Any advice much appreciated.
type tClass
integer :: i
contains
procedure Clear => Clear_Class
end type tClass
type tSubClass
integer :: j
contains
procedure Clear => Clear_SubClass
end type tSubClass
subroutine Clear_Class
i = 0
end subroutine
subroutine Clear_SubClass
inherited Clear ! this is the Delphi way
j = 0
end subroutine
推荐答案
以下是一些示例代码,试图通过@HighPerformanceMark实现注释(即,子类型具有引用父类型的隐藏组件). /p>
Here is some sample code that tries to implement the comment by @HighPerformanceMark (i.e., a child type has a hidden component that refers to the parent type).
module testmod
implicit none
type tClass
integer :: i = 123
contains
procedure :: Clear => Clear_Class
endtype
type, extends(tClass) :: tSubClass
integer :: j = 456
contains
procedure :: Clear => Clear_SubClass
endtype
contains
subroutine Clear_Class( this )
class(tClass) :: this
this % i = 0
end
subroutine Clear_SubClass( this )
class(tSubClass) :: this
this % j = 0
call this % tClass % Clear() !! (*) calling a method of the parent type
end
end
program main
use testmod
implicit none
type(tClass) :: foo
type(tSubClass) :: subfoo
print *, "foo (before) = ", foo
call foo % Clear()
print *, "foo (after) = ", foo
print *, "subfoo (before) = ", subfoo
call subfoo % Clear()
print *, "subfoo (after) = ", subfoo
end
提供(使用gfortran-8.2)
which gives (with gfortran-8.2)
foo (before) = 123
foo (after) = 0
subfoo (before) = 123 456
subfoo (after) = 0 0
如果我们注释掉以(*)标记的行,则subfoo % i
保持不变:
If we comment out the line marked by (*), subfoo % i
is kept unmodified:
foo (before) = 123
foo (after) = 0
subfoo (before) = 123 456
subfoo (after) = 123 0
这篇关于现代Fortran:从后代调用祖先过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!