2012-10-13 51 views
2

我在使用Ada和一些語法來解決繼承問題時遇到了一些困難。如何設置和從抽象標記記錄派生類型?

我的目標是從具有記錄的抽象類型派生出來,並在記錄字段中使用不同的數據類型。以下是我已經能夠編譯:

type Base is abstract new Parent.ParentType with record 
    X:Access_Type; 
end record 

type Child is new Base with record 
    n:Integer; 
end record; 

但我不希望有這種額外的N場,我想有X是孩子式的整數。我無法讓編譯器對此感到滿意。像下面的內容是什麼,我想:

type Base is abstract new Parent.ParentType with tagged record 
    X:Access_Type; 
end record; 

type Child is new Base with record 
    X:Integer; 
end record; 

不幸的是,我無法弄清楚如何標記基本類型,我認爲可以讓我重新分配X字段。 (沒有標記,編譯器會抱怨聲明有衝突。)

有人可以對此有所瞭解嗎?我對OO編程一般都很陌生,我發現Ada的類型方法比通常的類方法更令人困惑。

回答

3

Base已被標記,因爲你不能說is abstract new Parent.Parent_Type除非Parent.Parent_Type被標記,這意味着任何派生類型,如Base一定是太。

問題是,因爲你有它,任何代碼可以看到Child可以看到兩個X s; Base中的那個和Child中的那個。編譯器不會讓你模棱兩可;當其他人閱讀你的代碼並看到My_Child.X,他們怎麼知道你的意思是哪個X?這一輪

一種方法是使Base私人的完整聲明,以便有隻有一個My_Child.X可見可能性:

package Bases is 
    type Base is abstract new Parent.Parent_Type with private; 
private 
    type Base is abstract new Parent.Parent_Type with record 
     X : Float; 
    end record; 
end Bases; 

with Bases; 
package Children is 
    type Child is new Bases.Base with record 
     X : Integer; 
    end record; 
end Children; 
4

我不知道你想通過改變來解決什麼問題派生類型中的X的類型。如Ada 95 Rationale: II.1 Programming by Extension所建議,標記類型的擴展將組件添加到從基本類型繼承的組件。您可能正在尋找一種方法,使用discriminants來指定參數的派生類型。

附錄:這可能有助於理解Ada對普通object-oriented programming原則的支持不限於標記類型。

+1

你可能一直在想,'Child.X'將_shadow_'Base.X',因爲它會在Java,但不在阿達;見[PDF的第13頁](http://www.adacore.com/knowledge/technical-papers/a-comparison-of-the-object-oriented-features-of-ada-95-and-java/) 。 – trashgod

4

你確定你不只是想嵌套一些記錄嗎?

type Base is abstract new Parent.Parent_Type with record 
     X : Float; 
    end record; 

...

type child_rec is 
    X : integer; 
end record; 

...

type Child is new Bases.Base with record 
     C : Child_Rec; 
    end record; 

,這將使您參考

My_Base.X; 

My_Base.C.X; 

當然這是可以做到沒有任何的面向對象的功能過於....

相關問題