【问题标题】:Extending derived types in separate module without changing the type's name在单独的模块中扩展派生类型而不更改类型的名称
【发布时间】:2014-06-02 13:59:11
【问题描述】:

我可以通过添加一个模块文件来扩展程序,在该文件中我扩展最初定义的派生类型,例如:

module mod1

   type type1
      real :: x
   end type

end module

module mod2       

   use mod1    
   type,extends(type1) :: type2
      contains
      procedure,pass :: g
   end type

contains

   function g(y,e)
      class(type2), intent(in) :: y
      real,intent(in) :: e 
      g=y%x+e
   end function

end module

program test

use mod2

type(type2) :: a

a%x=3e0
write(*,*) a%g(5e0)

end program

但是使用此解决方案,每次添加另一个模块时,我都需要更改调用程序中“a”(type1->type2)的声明。所以我的问题是,是否有办法解决这个问题,即我可以将类型绑定过程添加到另一个模块中的派生类型,而无需更改类型的原始名称。

我完全理解这可能行不通,因为我可以声明一个变量并稍后扩展它的类型,这对我来说听起来有问题。所以,我想到了延期声明。但这并不是我真正想要的,因为我首先必须将它添加到原始定义中,其次我需要提供一个接口,因此需要知道后面的函数(这里是 g)的变量。但是,也许有人对此有很好的解决方案。

所有这些当然是为了给程序带来更多的结构,尤其是当我想到不同的人同时在一个程序上工作时,这种拆分工作包的可能性似乎相当有用。

【问题讨论】:

    标签: module fortran derived-types


    【解决方案1】:

    您可以使用 USE 语句的重命名功能来重命名与使用关联的实体。

    MODULE m2
      USE m1, chicken => type1
      TYPE, EXTENDS(chicken) :: type1
      ...
    

    模块m2中的type1与模块m1中的type1不同。

    您也可以在主程序的 USE 语句中或通过一些中间模块进行重命名。

    如果两个 type1 名称都可以在另一个范围内访问,并且您引用名称 type1,那么您的编译器会报错。

    如果你使用这个技巧并且其他程序员阅读了你的代码,那么他们可能会抱怨。

    【讨论】:

    • 当然,但是可能很难追踪哪个type1 正在使用下面的几个模块。
    • 注意我的最后一句话。
    • 有趣的解决方案,但实际上我什至害怕自己混淆不同的定义。
    【解决方案2】:

    在某种程度上submodules 会帮助你,但它们是在最广泛使用的编译器中实现的。您可以将过程的实现推迟到子模块,但无论如何您都必须指定接口。

    据我所知,这是不可能的。

    【讨论】:

    猜你喜欢
    • 2019-08-23
    • 1970-01-01
    • 2021-05-17
    • 2023-04-09
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 2011-07-22
    • 2022-11-25
    相关资源
    最近更新 更多