解决使用 OOP 时的过程混乱

Resolving procedure confusion when using OOP

我正在用 Fortran 编写矢量类型,我感到很困惑。

假设我有以下派生类型

Type (Vector)
Real :: x, y
Contains  
  Procedure :: vector_smul
End Type 

Function vector_smul  &
  (                   &
    va, vb            &
  )                   &
    Result (c)

  Real :: c
  Class (Vector), Intent (In) :: va, vb

  c = (va%x + vb%x) + (va%y * vb%y)

End Function vector_smul

但是当我使用

Type (Vectors)
Real :: x, y
Contains  
  Procedure :: smul => vector_smul
End Type 

我在使用时遇到错误

Program Test
  Use Vector
  Implicit None
  Real :: c
  Type (Vector) :: va, vb 
  c = smul (va, vb)
End Program

您只是在定义一个指向 vector_smul 的类型绑定过程 xyz%smul!原模块程序vector_smul不受影响!

为了保留 Fortran 标准(2008,第 4.5.5 章)的术语,smul 绑定名称 过程名称 vector_smul。您仍然可以访问过程本身。

在主程序中使用时可以"rename"函数:

Program Test
  Use Vector, only: Vector, smul => vector_smul
  Implicit None
  Real :: c
  Type (Vector) :: va, vb 
  c = smul (va, vb)
End Program

[尽管类型不同和模块不可能有相同的名称,即不能同时命名它们 Vector...]

看看 corresponding topic at the Fortran Wiki...