FORTRAN动态分配派生类型

时间:2014-09-05 22:48:20

标签: dynamic types polymorphism fortran runtime

我在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:这不是包含结构中定义的字段名称。任何解释?

1 个答案:

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