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

Fortran是否具备类似Java的class特性?如何实现多数据结构?

别急,Fortran从2003标准开始就引入了面向对象特性,完全可以实现类似Java class的功能,你之前觉得Module搞不定多个数据结构,应该是对Fortran的派生类型和模块用法有点误解~

Fortran中的"类"实现方案

其实Fortran里的**派生类型(Derived Type)+ 类型绑定过程(Type-Bound Procedures)**组合起来,就和Java的class几乎等价,而且模块(Module)完全可以同时管理多个这样的"类",下面给你详细拆解:

1. 基础:派生类型对应类的成员变量

派生类型就像Java类里的成员变量集合,你可以定义各种类型的字段:

module person_mod
    implicit none

    ! 定义Person派生类型(类似Java的Person类)
    type :: Person
        character(len=20) :: name
        integer :: age
    end type Person

end module person_mod

2. 类型绑定过程:给"类"添加方法

通过contains块和procedure关键字,你可以给派生类型绑定过程(也就是Java里的方法),包括普通方法、构造函数、析构函数:

module person_mod
    implicit none

    type :: Person
        character(len=20) :: name
        integer :: age
        ! 声明要绑定的方法
        contains
            procedure :: get_name => person_get_name
            procedure :: set_age => person_set_age
            final :: person_finalize  ! 析构函数,对象销毁时自动调用
    end type Person

contains

    ! 获取名字的方法
    function person_get_name(this) result(name)
        class(Person), intent(in) :: this
        character(len=20) :: name
        name = this%name
    end function person_get_name

    ! 设置年龄的方法
    subroutine person_set_age(this, new_age)
        class(Person), intent(inout) :: this
        integer, intent(in) :: new_age
        if (new_age >= 0) this%age = new_age
    end subroutine person_set_age

    ! 析构函数
    subroutine person_finalize(this)
        type(Person), intent(inout) :: this
        print *, "Person对象", this%name, "已销毁"
    end subroutine person_finalize

    ! 构造函数(可以用函数返回类型实例,类似Java的构造方法)
    function create_person(name, age) result(new_person)
        character(len=*), intent(in) :: name
        integer, intent(in) :: age
        type(Person) :: new_person
        new_person%name = name
        new_person%age = age
    end function create_person

end module person_mod

3. 一个Module可以管理多个"类"

你之前觉得Module无法处理多个数据结构,其实是误解啦!一个Module里可以定义多个派生类型,每个类型有自己的绑定过程,比如同时定义Person和Car:

module vehicle_and_person_mod
    implicit none

    ! 第一个"类":Person
    type :: Person
        character(len=20) :: name
        contains
            procedure :: get_name => person_get_name
    end type Person

    ! 第二个"类":Car
    type :: Car
        character(len=10) :: license_plate
        integer :: year
        contains
            procedure :: get_year => car_get_year
    end type Car

contains

    ! Person的方法
    function person_get_name(this) result(name)
        class(Person), intent(in) :: this
        character(len=20) :: name
        name = this%name
    end function person_get_name

    ! Car的方法
    function car_get_year(this) result(year)
        class(Car), intent(in) :: this
        integer :: year
        year = this%year
    end function car_get_year

end module vehicle_and_person_mod

4. 进阶:继承与多态(类似Java的继承和抽象方法)

Fortran 2003还支持扩展派生类型(也就是继承),以及延迟绑定过程(类似Java的抽象方法),实现多态:

module shape_mod
    implicit none

    ! 抽象基类Shape
    type, abstract :: Shape
        contains
            procedure(shape_area), deferred :: area  ! 延迟方法,子类必须实现
    end type Shape

    ! 延迟过程的接口
    abstract interface
        function shape_area(this) result(a)
            import :: Shape
            class(Shape), intent(in) :: this
            real :: a
        end function shape_area
    end interface

    ! 子类Circle,继承Shape
    type, extends(Shape) :: Circle
        real :: radius
        contains
            procedure :: area => circle_area
    end type Circle

    ! 子类Rectangle,继承Shape
    type, extends(Shape) :: Rectangle
        real :: width, height
        contains
            procedure :: area => rectangle_area
    end type Rectangle

contains

    function circle_area(this) result(a)
        class(Circle), intent(in) :: this
        real :: a
        a = 3.14159 * this%radius**2
    end function circle_area

    function rectangle_area(this) result(a)
        class(Rectangle), intent(in) :: this
        real :: a
        a = this%width * this%height
    end function rectangle_area

end module shape_mod

这样用起来就和Java的面向对象几乎一致了,你可以根据需求组织你的派生类型和模块,完全不用担心多个数据结构的管理问题~

内容的提问来源于stack exchange,提问作者Koreyuki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:04:42