2014-09-02 108 views
0

問題是在其派生類型中重命名基類型的成員。我認爲可以這樣做,因爲FORTRAN提供了指針和關聯函數。 例如:FORTRAN:重命名派生類型中的成員

type :: base1 
    integer :: old 
endtype base1 

type, extends(base1) :: derived1 
    !here I want old to be renamed as new 
    !Something like new=> old 
    !So I can use derived1%new elsewhere 
endtype derived1 

但問題是BASE1%老不能目標。所以我想我不能使用指針來做到這一點。我不知道該把關聯放在哪裏。有什麼建議麼?謝謝!

回答

3

該語言不提供從父類型繼承的組件的重命名,以任何一般方式。

雖然在概念上,可以將重載類型的指針組件與重載結構構造函數或類似的父類型組件相關聯,但存在許多缺陷。

  • 對於擴展類型的組件的指針關聯到重載的結構構造的外保持有效的對象將總是需要有目標屬性(或父組件本身將需要一個指針) 。

  • 無論何時複製對象的值(這比分配更廣泛 - 考慮VALUE和ALLURATE中的SOURCE =說明符),您需要重新關聯副本中擴展類型的指針組件。

我不會走這條路。


從概念上講,如果父類型的組件是公有的,那麼該組件是該父類型的接口的一部分。類型擴展意味着擴展類型具有父類型接口的超集,但組件所需的重命名暗示您不需要這樣。如果你不希望擴展類型的接口是父類型的接口,那麼擴展類型可能不應該是父類的擴展 - 也許你會更好地做出現在的東西父類型是擴展類型的普通組件。

+0

感謝您的解釋。我不太瞭解最後一段。我明白擴展類型是基類型的超集。假設,如果以某種方式完成了重命名,則擴展類型不再是基類型的超集。但是對於同一個變量的兩個名字呢?從概念上講,如果擴展類型有一個指向其基類成員的指針,則擴展類型仍然是基類型的超集,對吧?所以擴展類型從它的基類型中繼承了所有成員定義的一個新名稱。你能再解釋一下嗎? – FortCpp 2014-09-02 23:34:10

+0

@FortCpp IanH的意思是用組件type(base1):: new'聲明'type :: derived1'。 'old'將被作爲'derived1%new%old'訪問。 – PetrH 2014-09-03 09:24:12

+0

如果您只是將新名稱與現有名稱並行使用,那麼 - 是的 - 在這種情況下,您正在維護父類型的接口。 – IanH 2014-09-03 09:24:21