有两种方法可以使用相同的函数作为类型绑定过程吗?例如。想象一下以下情况:
module definitions
implicit none
type type1
integer i
contains
procedure,pass :: init1
end type
type type2
integer i
contains
procedure,pass :: init2
end type
contains
subroutine init1(x)
class(type1),intent(inout) :: x
x%i=3
end subroutine
subroutine init2(x)
class(type2),intent(inout) :: x
x%i=3
end subroutine
end module
program test
use definitions
type(type1) ::a
type(type2) ::b
print*, a%i
print*, b%i
call a%init1
print*, a%i
print*, b%i
call b%init2
print*, a%i
print*, b%i
end program
如您所见,我使用了相同的子程序,但我觉得不得不两次定义它。所以我要求像
这样的东西class(type1 .or. type2), intent(inout) :: x
或类似的。我已经尝试了类(*)但这当然不起作用,因为编译器然后不知道如何处理可能未定义的x%i,甚至不与select类型块组合。我想提一下真正的程序更复杂,因此不容易合并类型定义的类似部分,然后扩展然后定义这两种类型。 提前谢谢!
答案 0 :(得分:1)
不可能直接。但为什么不创建一个基本类型然后扩展?
module definitions
implicit none
type base
integer i
contains
procedure,pass :: init
end type
type, extends(base) :: type1
end type
type, extends(base) :: type2
end type
contains
subroutine init(x)
class(base),intent(inout) :: x
x%i=3
end subroutine
end module
program test
use definitions
type(type1) ::a
type(type2) ::b
print*, a%i
print*, b%i
call a%init
print*, a%i
print*, b%i
call b%init
print*, a%i
print*, b%i
end program
编辑(PM):这解决了我实际想到的问题:
module definitions
implicit none
type base
integer :: i
contains
procedure,pass :: init
end type
type, extends(base) :: type1
integer:: j
end type
type, extends(base) :: type2
integer:: k
end type
contains
subroutine init(x)
class(base),intent(inout) :: x
integer :: m
select type (x)
type is (type1)
m=x%j
type is (type2)
m=x%k
end select
x%i=3*m
end subroutine
end module
program test
use definitions
type(type1) ::a
type(type2) ::b
a%j=2
b%k=4
print*, a%i
print*, b%i
call a%init
print*, a%i
print*, b%i
call b%init
print*, a%i
print*, b%i
end program
1,5 Top