我有一个将数据导出到文件的模块。 它从不同的模块导出类似的数据。 目前,我为每种类型的数据都有一个导出模块,唯一的区别是单行。 这是一个简单的例子
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
导出模块完全相同,除了"使用"声明。 我不想保留同一导出模块的多个副本。 有没有办法将导出模块中的子程序添加到我的所有不同模块中?
答案 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