2014-09-05 95 views
2

我正在使用FORTRAN中的OOP功能,但我不確定是否可以動態分配派生類型。可能是體外受精不支持它或標準(2003)禁止這樣做。FORTRAN動態分配派生類型

爲了說明,我有一個基類DiscPlayer和2種派生類型DVD播放機和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:這不是在包容結構中定義的字段名稱。任何解釋?

回答

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)

請注意,您還可以在select type中使用class isclass default

+0

是的。這從邏輯上講是合理的。你能講更多關於課堂的嗎?我明白類型是。班級和班級有什麼不同? – FortCpp 2014-09-05 23:04:22

+2

'類是(t)'如果動態類型是't'或任何擴展類型't',則執行該段。 – 2014-09-05 23:08:02