网教网

搜索
查看: 128|回复: 0

Fortran面向对象编程入门教程(s1)

[复制链接]

1

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2023-3-5 10:31:02 | 显示全部楼层 |阅读模式
前言

Fortran编程已经步入第四年了,再过几年就可能干不动了,总结一下自己的编程经验。
最近越发爱上了模块化、对象化代码编程,想着先在知乎上更新几篇用于面向对象编程的Fortran心得。
我不知道面向对象是什么概念,理论不足,准备做一个民科。
我理解的Fortran面向对象

Fortran是高性能语言,与C/C++十分相似,但是在数组数学上做了长远的尝试,但同时比较固执,向后兼容性不止困扰着C++开发者,Fortran亦如此。
写Fortran的时候,你可能会过于担心编码风格、养成很好的变量域控制,但我推荐粗暴些。但是粗暴些的话,代码量一旦上去了,容易杂乱无章,大量的函数、变量,管不过来!
面向对象是一个好的方式,将函数与数据归类、暴露!(OOP三大特征之一:封装)

  • 在写数学函数,一般采用纯函数写法就行;
  • 其它,一般涉及数学建模,建模就离不开积木,而且是有品质的积木,面向对象就是好手!
基本数据类型与结构体

编程中,无论是静、动态语言,数据类型是真实存在的,这是一种归类的艺术,我们一般有整型、浮点型、字符型等基本数据类型:

  • 1个苹果;
  • 重力加速度:9.806m/s^2;
  • 我叫“zoziha”。
基本数据类型是单元,结构体是将单元组合在一起,开始变得多样而灵活,比如我叫“zoziha”,站在一个重力加速度为g的地球上:
!> 人
type person
  character(128) :: name  !! 姓名
  real(8) :: g  !! 重力加速度
end type person
type(person) :: p1 = person(name='zoziha', g=9.806_8)备注:不幸的是Fortran并不支持更完备的OOP范式,如print *, person(name='zoziha', g=9.806_8)%name。
绑定例程

数只是数,没有动作,它就是纯静态的数,我们需要动起来,我们可以为结构体绑定过程:
module demo_person
!> 人
type person
  character(128) :: name  !! 姓名
  real(8) :: g  !! 重力加速度
contains
  procedure :: say_hello
end type person
type(person) :: p1 = person(name='zoziha', g=9.806_8)
contains
subroutine say_hello(self)
  class(person), intent(inout) :: self
  print *, 'Hello from ', name
end subroutine say_hello
end module demo_person通过procedure将例程say_hello绑定为person的方法,下次你就可以使用call p1%say_hello()来打招呼了。
备注1:绑定例程需要使用关键字class而不是type,只有保留了class,你才知道你写的是OOP。
备注2:Fortran使用%来访问方法和成员,因为.在Fortran被自定义操作符(如.and.)占用了!
okay,爱玩Fortran的同学,第一部分内容就到这了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表