2015-02-09 62 views
1

我有一個基礎庫,由兩個不同的應用程序使用。我們最近在基礎庫中更改了一些內容,現在正在將這些應用程序調整爲適應這一變化。今天,我偶然發現了一些以面向對象的方式做出來的好主意的代碼,但我越想到它,我認爲Fortrans OO功能就越少。類型擴展前後

但是詳細說明:我們有一個例程在一個類型上運行,如果它是屬性,則使用一個例程。讓我們把它叫做容器:

type element 
    integer :: id 
end type element 
type container 
    type(element), allocatable :: elements(:) 
end type container 

每個應用程序現在能夠擴大這種類型:

type, extends(container) :: myContainer 
    !... 
end type myContainer 

直到這裏的一切是相當優良。但是,如果一個應用程序需要延長element類型,以及:

type, extends(elemet) :: myElement 
    integer :: someOtherStuff 
end type myEement 

當我已經功成名就的權利,有可能的myElement實例添加到myContainer%elemets,至少使用myElement%element。但是也可以從myContainer%element中獲得原始實例嗎?

考慮下面的代碼:

type(myElement) :: element, after 
type(myContainer) :: container 
allocate(myContainer%elements(1)) 

!will result in Can't convert TYPE(myElement) to TYPE(element) 
!myContainer%elements(1) = element 
myContainer%elements(1) = element%element 

! vice versa from above 
!after = myContainer%elements(1) 
after%element = myContainer%elements(1) 

我可以從列表中的元素分配給after%element,但具體到myElement所有數據將不會被設置。我猜這個數據已經在上丟失了當分配element%element到列表中時?那麼有沒有辦法在Fortran中實現某種類型的保存,即使將它的實例設置爲element,也可以保留myElement的信息?

在其他語言中,例如C#可以將一個子類分配給一個超類的集合,重新獲取該實例並將其作爲子類再次使用,因爲完整的對象存儲在集合中,並且只是作爲超類的一個實例進行處理。當再次作爲子類尋址時,它仍然包含它在添加到集合之前的所有信息。

Fortran中是否有類似的東西?

回答

3

可以使容器能夠包含一個多態值

type container 
    class(element), allocatable :: elements(:) 
end type container 

那麼你就可以在陣列elements分配給從element擴展類型。

當您剛剛分配element%element時,您只複製對應於基本類型的擴展類型的一部分。

+0

感謝您的回答。但我不明白如何將數組'elemets'分配給另一種類型。也許我對攝影的速度很慢,請你詳細說明一下嗎? – PVitt 2015-02-10 09:20:40