我在FORTRAN中使用OOP功能,但我不确定是否可以动态分配派生类型。可能是IVF不支持它或标准(2003)禁止这样做。
为了说明,我有一个基类DiscPlayer和2个派生类型DVDPlayer和BDPlayer
type, abstract :: DiscPlayer
private
integer, public :: Capacity = 3
endtype DiscPlayer
和
type, extends(DiscPlayer) :: DVDPlayer
private
integer, public :: RemoteController
endtype DVDPlayer
在主程序中,我希望在运行时决定变量类型。
program test
use ModDiscPlayer
use ModDVDPlayer
use ModBDPlayer
implicit none
class(DiscPlayer), allocatable :: P1
integer :: i
i = 1 ! will add user input
select case(i)
case(1)
allocate(DVDPlayer::P1)
P1%RemoteController = 1
case(2)
allocate(BDPlayer::P1)
endselect
endprogram test
然后我收到了错误的消息:错误#6460:这不是包含结构中定义的字段名称。任何解释?
答案 0 :(得分:2)
您只能访问这些组件并键入变量的绑定过程,这些过程在其声明的类型中是不同的。此处,声明的类型为DiscPlayer
,因此您只能直接使用Capacity
。
如果您知道您拥有或可能拥有某种具体的动态类型,则可以使用select type
构造来访问动态类型的属性。
case(1)
allocate(DVDPlayer::P1)
select type(P1)
type is (DVDPlayer)
P1%RemoteController = 1
end select
case(2)
如果与select type
分支中的类型的运行时比较成功,则可以在该分支中使用它,因为它是type(DVDPlayer)
。
请注意,您也可以在class is
中使用class default
和select type
。