如何制作多个具有不同“使用”的类似Fortran模块?声明?

时间:2016-10-26 05:16:02

标签: oop module fortran

我有一个将数据导出到文件的模块。 它从不同的模块导出类似的数据。 目前,我为每种类型的数据都有一个导出模块,唯一的区别是单行。 这是一个简单的例子

module cat
  contains
  character(len=10) function name()
    name = 'Meowser'
  end function name
end module cat

module dog
  contains
  character(len=10) function name()
    name = 'Barkster'
  end function name
end module dog

module export_cat
  use cat
  contains
  subroutine export_name
    print *, name()
  end subroutine export_name
end module export_cat

module export_dog
  use dog
  contains
  subroutine export_name
    print *, name()
  end subroutine export_name
end module export_dog

program main
  use export_dog
  call export_name
end program main

导出模块完全相同,除了"使用"声明。 我不想保留同一导出模块的多个副本。 有没有办法将导出模块中的子程序添加到我的所有不同模块中?

1 个答案:

答案 0 :(得分:1)

这可以使用INCLUDE来完成。

module animals
  implicit none
  public :: export

  type, public, abstract :: animal
  contains
    procedure(animal_name), deferred, nopass :: name
  end type animal

  abstract interface
    function animal_name()
      import animal
      implicit none
      character(:), allocatable :: animal_name
    end function animal_name
  end interface
contains
  subroutine export(obj)
    class(animal), intent(in) :: obj
    print *, obj%name()
  end subroutine export
end module animals

module cats
  use animals
  implicit none
  private
  type, public, extends(animal) :: cat
  contains
    procedure, nopass :: name
  end type cat
contains
  function name()
    character(:), allocatable :: name
    name = 'Meowser'
  end function name
end module cats

module dogs
  use animals
  implicit none
  private
  type, public, extends(animal) :: dog
  contains
    procedure, nopass :: name
  end type dog
contains
  function name()
    character(:), allocatable :: name
    name = 'Barkster'
  end function name
end module dogs

program main
  use animals
  use cats
  use dogs
  class(animal), allocatable :: x
  x = cat()
  call export(x)
end program main

请注意,编写时,每个export_name过程都是特定的,并且您将在访问两个或多个具有相同名称的特定过程的作用域中获得名称冲突。

~~~

OOP方法(因为你标记了它)通常是定义一个类型,作为猫和狗的共同父类(可能是动物),一个操作类型为animal的多态参数的导出过程然后调用一个过程通过绑定实现特定于类型的行为。

null