Fortran派生类型中函数的“扩展”实现咨询(非覆盖)
在Fortran OOP中扩展父类过程:先执行父类逻辑再添加子类操作
嘿,我完全懂你的需求——你不是要覆盖父类的方法,而是想让子类的同名过程先做完父类该做的所有工作,再加上自己的额外操作对吧?这个在Fortran里是可以实现的,咱们用显式调用父类绑定过程的方式就能搞定,先给你理清楚思路,再给你修正后的完整代码示例。
首先得明确:你说的“扩展”其实就是在子类的过程里主动调用父类的同名过程。Fortran没有像Java那样的super关键字,但可以通过将子类对象转换为父类类型的方式来调用父类的过程。
修正后的完整代码示例
1. 父类模块(foo1)
先把你原来的代码里的小错误修正一下(比如过程的参数要包含类型实例,命名也尽量清晰):
module foo1 implicit none type :: bar1 contains procedure :: f1 => bar1_f1 ! 将过程与类型绑定,分开命名更清晰 end type bar1 contains subroutine bar1_f1(this) class(bar1), intent(inout) :: this ! 用class而不是type,支持多态 ! 父类的核心操作 print *, "[父类 bar1] 执行f1:完成基础初始化/处理工作" end subroutine bar1_f1 end module foo1
2. 子类模块(foo2)
这里的关键就是在子类的f1过程里,先调用父类的f1:
module foo2 use foo1 implicit none type, extends(bar1) :: bar2 ! 继承bar1的子类 contains procedure :: f1 => bar2_f1 ! 子类的同名过程 end type bar2 contains subroutine bar2_f1(this) class(bar2), intent(inout) :: this ! 第一步:调用父类的f1过程 ! 通过this%bar1将子类实例转换为父类类型,从而调用父类的绑定过程 call this%bar1%f1() ! 第二步:添加子类的额外操作 print *, "[子类 bar2] 执行f1:完成专属的额外处理工作" end subroutine bar2_f1 end module foo2
3. 测试主程序
program test_extend_procedure use foo2 implicit none type(bar2) :: my_subclass_obj ! 调用子类的f1,会先执行父类逻辑,再执行子类逻辑 call my_subclass_obj%f1() end program test_extend_procedure
关键说明
- 多态支持:父类的过程参数必须用
class(bar1)而不是type(bar1),这样子类对象才能被传递给父类的过程,实现多态调用。 - 调用父类过程:
call this%bar1%f1()这一行是核心——this%bar1相当于把当前子类实例“向上转型”为父类类型,从而触发父类的f1过程执行,之后再执行子类自己的代码。 - 命名规范:把过程命名为
bar1_f1、bar2_f1而不是直接用f1,可以避免和类型名或其他过程冲突,代码可读性更高。
运行这个程序,你会看到输出顺序是先父类的打印内容,再子类的,完全符合你想要的“先完成父类所有工作,再添加额外操作”的需求。
内容的提问来源于stack exchange,提问作者bob.sacamento
相关产品推荐
相关产品推荐

