Oop 如何使用不同的';使用';陈述

Oop 如何使用不同的';使用';陈述,oop,module,fortran,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()

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

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
除了“use”语句外,导出模块完全相同。 我不想维护同一导出模块的多个副本。
是否有办法将导出模块中的子例程添加到所有不同的模块中?

这是可以使用INCLUDE完成的

 !*************
 ! common.i90
 subroutine export_name
   print *, name
 end subroutine export_name

!*************
! elsewhere...

module export_cat
  use cat
contains
  include 'common.i90'
end module export_cat

module export_dog
  use dog
contains
  include 'common.i90'
end module export_dog
...
请注意,如前所述,每个导出过程都是特定的,在访问两个或多个具有相同名称的特定过程的作用域中会出现名称冲突

~~~

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

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

大家好,试着用一个问题标题来描述您的问题,而不仅仅是主题,下面的标签
fortran
module
已经描述了这个主题。