我有一個基礎庫,由兩個不同的應用程序使用。我們最近在基礎庫中更改了一些內容,現在正在將這些應用程序調整爲適應這一變化。今天,我偶然發現了一些以面向對象的方式做出來的好主意的代碼,但我越想到它,我認爲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中是否有類似的東西?
感謝您的回答。但我不明白如何將數組'elemets'分配給另一種類型。也許我對攝影的速度很慢,請你詳細說明一下嗎? – PVitt 2015-02-10 09:20:40