Fortran 中的多态性
Polymorphism in fortran
我的代码类似于:
Module C_sys
use class_A
implicit none
Private
Type, public :: C_sys_type
private
logical :: Ao_set = .false.
type(A) :: Ao
Contains
Private
Procedure, public :: get_Ao
Procedure, public :: set_Ao
End Type C_sys_type
interface C_sys_type
Procedure C_sys_type_constructor
end interface C_sys_type
Contains
type(C_sys_type) elemental function C_sys_type_constructor(Ao) result(C_sys)
type(A), intent(in), optional :: Ao
C_sys % Ao = Ao
C_sys % Ao_set = .true.
end function C_sys_type_constructor
type(A) elemental function get_Ao
class(C_sys_type), intent(in) :: this
get_Ao = this % Ao
end function get_Ao
subroutine set_Ao(this, Ao)
class(C_sys_type), intent(inout) :: this
type(Ao), intent(in) :: Ao
this % Ao = Ao
this % Ao_set = .true.
end subroutine set_Ao
End Module C_sys
我不确定在子例程 set_Ao 中的什么地方,type(Ao), intent(in) :: Ao 应该像这样保留或者改为 class(Ao), intent (中)::敖。我知道 class(Ao) 正在使变量多态并访问 A 的数据类型。但我不知道什么时候必须使用它。
谢谢。
如果您希望能够将 function/subroutine 绑定到派生类型(并且该例程能够 access/modify 该类型实例的成员,这是通常的用例;简称“PASS
ing”一个变量),需要满足以下条件:
TYPE
定义必须包含适当的 PROCEDURE
行(明确说明 PASS
,或者在未指定 NOPASS
时默认存在)。
- function/subroutine 至少有一个
TYPE
的虚拟参数,必须在参数列表中用 CLASS
声明(受所有限制) .
- 它需要
CLASS
的 原因 因为其他 TYPE
可能 "extend" 您的 TYPE
,这会意味着它继承了它的成员——这只有在成员例程是数据多态的情况下才有效。
我已尝试将您提供的代码示例修改为代表我认为您实际意思的东西,但实际编译,希望能证明正确的用法。
module c_sys
implicit none
private
type, public :: a
integer :: i
end type
type, public :: c_sys_type
private
logical :: ao_set = .false.
type(a) :: ao
contains
private
procedure, public :: get_ao
procedure, public :: set_ao
end type c_sys_type
interface c_sys_type
procedure c_sys_type_constructor
end interface c_sys_type
contains
type(c_sys_type) elemental function c_sys_type_constructor(ao) result(c_sys)
type(a), intent(in), optional :: ao
c_sys % ao = ao
c_sys % ao_set = .true.
end function c_sys_type_constructor
type(a) elemental function get_ao(this)
class(c_sys_type), intent(in) :: this
get_ao = this % ao
end function get_ao
subroutine set_ao(this, ao)
class(c_sys_type), intent(inout) :: this
type(a), intent(in) :: ao
this % ao = ao
this % ao_set = .true.
end subroutine set_ao
end module c_sys
- 我假设您的
TYPE A
和 TYPE AO
是在您未提供的 CLASS_A
模块中定义的。我在我的版本中声明了一个虚拟类型。
如果您想使用 NOPASS
等,事情会变得更复杂,但是对于 "normal" 的用法,我希望这能回答您的问题。
我的代码类似于:
Module C_sys
use class_A
implicit none
Private
Type, public :: C_sys_type
private
logical :: Ao_set = .false.
type(A) :: Ao
Contains
Private
Procedure, public :: get_Ao
Procedure, public :: set_Ao
End Type C_sys_type
interface C_sys_type
Procedure C_sys_type_constructor
end interface C_sys_type
Contains
type(C_sys_type) elemental function C_sys_type_constructor(Ao) result(C_sys)
type(A), intent(in), optional :: Ao
C_sys % Ao = Ao
C_sys % Ao_set = .true.
end function C_sys_type_constructor
type(A) elemental function get_Ao
class(C_sys_type), intent(in) :: this
get_Ao = this % Ao
end function get_Ao
subroutine set_Ao(this, Ao)
class(C_sys_type), intent(inout) :: this
type(Ao), intent(in) :: Ao
this % Ao = Ao
this % Ao_set = .true.
end subroutine set_Ao
End Module C_sys
我不确定在子例程 set_Ao 中的什么地方,type(Ao), intent(in) :: Ao 应该像这样保留或者改为 class(Ao), intent (中)::敖。我知道 class(Ao) 正在使变量多态并访问 A 的数据类型。但我不知道什么时候必须使用它。
谢谢。
如果您希望能够将 function/subroutine 绑定到派生类型(并且该例程能够 access/modify 该类型实例的成员,这是通常的用例;简称“PASS
ing”一个变量),需要满足以下条件:
TYPE
定义必须包含适当的PROCEDURE
行(明确说明PASS
,或者在未指定NOPASS
时默认存在)。- function/subroutine 至少有一个
TYPE
的虚拟参数,必须在参数列表中用CLASS
声明(受所有限制) .- 它需要
CLASS
的 原因 因为其他TYPE
可能 "extend" 您的TYPE
,这会意味着它继承了它的成员——这只有在成员例程是数据多态的情况下才有效。
- 它需要
我已尝试将您提供的代码示例修改为代表我认为您实际意思的东西,但实际编译,希望能证明正确的用法。
module c_sys
implicit none
private
type, public :: a
integer :: i
end type
type, public :: c_sys_type
private
logical :: ao_set = .false.
type(a) :: ao
contains
private
procedure, public :: get_ao
procedure, public :: set_ao
end type c_sys_type
interface c_sys_type
procedure c_sys_type_constructor
end interface c_sys_type
contains
type(c_sys_type) elemental function c_sys_type_constructor(ao) result(c_sys)
type(a), intent(in), optional :: ao
c_sys % ao = ao
c_sys % ao_set = .true.
end function c_sys_type_constructor
type(a) elemental function get_ao(this)
class(c_sys_type), intent(in) :: this
get_ao = this % ao
end function get_ao
subroutine set_ao(this, ao)
class(c_sys_type), intent(inout) :: this
type(a), intent(in) :: ao
this % ao = ao
this % ao_set = .true.
end subroutine set_ao
end module c_sys
- 我假设您的
TYPE A
和TYPE AO
是在您未提供的CLASS_A
模块中定义的。我在我的版本中声明了一个虚拟类型。
如果您想使用 NOPASS
等,事情会变得更复杂,但是对于 "normal" 的用法,我希望这能回答您的问题。