类型绑定程序中的多态性

时间:2014-04-10 11:55:39

标签: fortran derived-class

有两种方法可以使用相同的函数作为类型绑定过程吗?例如。想象一下以下情况:

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类型块组合。我想提一下真正的程序更复杂,因此不容易合并类型定义的类似部分,然后扩展然后定义这两种类型。 提前谢谢!

1 个答案:

答案 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