【发布时间】:2019-03-06 12:18:44
【问题描述】:
我有一个基本模块,它定义了一些子例程(sub1、sub2、sub3)。然后,我想在一系列子模块中覆盖这些子例程。
我知道如何使用单独的模块和延迟类型来做到这一点,但我决定尝试使用 子模块。不幸的是,我不明白它们的用法。
这是我目前所拥有的:
基础模块:
module BaseModule
implicit none
interface
subroutine sub1(idx)
implicit none
integer, intent(in) :: idx
end subroutine sub1
subroutine sub2(idx)
implicit none
integer, intent(in) :: idx
end subroutine sub2
subroutine sub3(idx)
implicit none
integer, intent(in) :: idx
end subroutine sub3
end interface
end module BaseModule
ChildModule1:
submodule (BaseModule) ChildModule1
implicit none
type :: Child1
contains
module procedure :: sub1
module procedure :: sub2
end type
contains
module subroutine sub1
print*, "Child 1 - execute 'sub1' - idx = ", idx
end subroutine sub1
module subroutine sub2
print*, "Child 1 - execute 'sub2' - idx = ", idx
end subroutine sub2
end submodule ChildModule1
ChildModule2:
submodule (BaseModule) ChildModule2
implicit none
type :: Child2
contains
module procedure :: sub1
module procedure :: sub2
module procedure :: sub3
end type
contains
module subroutine sub1
print*, "Child 2 - execute 'sub1' - idx = ", idx
end subroutine sub1
module subroutine sub2
print*, "Child 2 - execute 'sub2' - idx = ", idx
end subroutine sub2
module subroutine sub3
print*, "Child 2 - execute 'sub3' - idx = ", idx
end subroutine sub3
end submodule ChildModule2
测试:
program test
use ChildModule1
use Childmodule2
implicit none
integer :: idx
type(Child1) :: c1
type(Child2) :: c2
do idx = 1, 10
!! Child1 outputs
call c1%sub1(idx)
call c1%sub2(idx)
!! Child2 outputs
call c1%sub1(idx)
call c2%sub2(idx)
call c1%sub3(idx)
end do
end program test
我对 submodules 的想法是我不必再次声明所有 inouts,但如果我想使用相同的子例程(例如 @ 987654329@) 在我声明不同类型的更多子模块中?现在我得到编译错误:
Error: MODULE PROCEDURE at (1) must be in a generic module interface
【问题讨论】:
-
我真的不明白你的实际问题是什么。帖子中有一句话带问号,但它是相当开放的,我认为它确实需要一些例子,你想要什么,你遇到了什么问题。请注意,子模块是一个相当新的功能,我还没有将它们用于实际编程。大多数 OOP 可以在没有它们的情况下完成。
-
感谢您的回答!我已经更新了我的问题,希望它现在更有意义!
-
也许您对什么是子模块及其工作方式有误解。请参考this answer。