You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:33:29