Dynamic FORTRAN动态分配派生类型

Dynamic FORTRAN动态分配派生类型,dynamic,types,polymorphism,fortran,runtime,Dynamic,Types,Polymorphism,Fortran,Runtime,我正在使用FORTRAN中的OOP功能,但我不确定是否可以动态分配派生类型。可能是IVF不支持它,或者标准(2003)禁止这样做 举例来说,我有一个基类DiscPlayer和两个派生类型DVDPlayer和BDPlayer type, abstract :: DiscPlayer private integer, public :: Capacity = 3 endtype DiscPlayer 及 在主程序中,我希望在运行时确定变量类型 program test use Mo

我正在使用FORTRAN中的OOP功能,但我不确定是否可以动态分配派生类型。可能是IVF不支持它,或者标准(2003)禁止这样做

举例来说,我有一个基类DiscPlayer和两个派生类型DVDPlayer和BDPlayer

type, abstract :: DiscPlayer
    private
    integer, public :: Capacity = 3
endtype DiscPlayer

在主程序中,我希望在运行时确定变量类型

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

然后我得到了错误的消息:error#6460:这不是包含结构中定义的字段名。有什么解释吗

您只能访问变量的组件和类型绑定过程,这些组件和过程在其声明的类型中被隔离。这里,声明的类型是
DiscPlayer
,因此您只能直接使用
容量

如果您知道您拥有或可能拥有某个具体的动态类型,则可以使用
selecttype
构造来访问该动态类型的属性

case(1)
    allocate(DVDPlayer::P1)

    select type(P1)
      type is (DVDPlayer)
        P1%RemoteController = 1
    end select
case(2)
如果与
select type
分支中的类型的运行时比较成功,则可以在该分支中按
type(DVDPlayer)
的方式使用它


注意:您也可以在
选择类型中使用
类is
类default
。这在逻辑上是有道理的。你能多告诉我一点关于班级的情况吗?我知道类型是。class is和type is有什么区别?
class is(t)
如果动态类型是
t
t
的任何扩展类型,则执行节。
case(1)
    allocate(DVDPlayer::P1)

    select type(P1)
      type is (DVDPlayer)
        P1%RemoteController = 1
    end select
case(2)