2015-02-12 55 views
4

有點不好意思問這個,但我知道它是最好的。我已經在Ada進行了多年的編程,並且能夠流利地理解幾乎所有的語言部分。但是,我從來沒有想過能夠把頭繞在T'Class身邊。爲了借用他人,有人能「像我五歲那樣解釋嗎?」。Ada的T'Class基礎知識

編輯:我買了它只是爲了,但內含的是T'Class的一個很好的描述和例子的使用;我參考Michael B. Feldman的「軟件構建和數據結構與Ada 95」。

回答

5

如果你開始

package P1 is 
    type T is tagged private; 
    procedure Method (Self : T); 
end P1; 
package P2 is 
    procedure Proc (Self : T); -- not a primitive 
    procedure Proc2 (Self : T'Class); 
end P2; 

在PROC的情況下,你是在告訴參數應始終認爲正是由於T類型的編譯器(記住,標籤類型總是通過引用傳遞,所以實際的類型可以從T派生,當然,你不會失去額外的數據)。特別是,這意味着在Proc體內,對Method的所有調用都將完全調用P1.Method,而不會調用重載的Method。

就Proc2而言,您告訴編譯器您不知道靜態的確切類型,因此需要在運行時插入額外的代碼來解析事情。在Proc2的主體中調用Method可以調用P1.Method,或者調用另一個重載的Method。

基本上:使用'類,事情在運行時解決。

+0

雖然我似乎感到困惑,但如果我通過創建一個孩子T2來得出T,我不能同時使用Proc和Proc2以及T2的實例作爲參數嗎? 如果我正確地理解了你,如果T2重寫方法,那麼T2.Proc實際上會調用T.Method,而T2.Proc2會調用T2.Method。 – 2015-02-12 19:10:32

+1

是的,你可以同時使用Proc和Proc2(儘管在Proc的情況下你必須執行:Proc(T(Var))。當proc執行一個對Method的調用時會發生差異,因爲不同的子程序會被調用在這兩種情況下(假設T2覆蓋方法),你對調度的理解是正確的(除了你不能調用T2.Proc到T2.Proc2,只是Proc2(T2),這不是一個原始操作) – manuBriot 2015-02-13 09:02:01

+1

@manuBriot :GNAT允許'T2.Proc2'。 – 2015-02-14 08:59:47

2

那麼,如果你是五歲,我會說T'Class代表T的全家。 我們是指家庭,指的是兒童,大孩子和盛大的孩子。

因爲你不是五個,這意味着這個特殊類型表示在T的繼承樹中的每個標記類型。這樣,如果使用此類型作爲參數,則可以使用每個具有T作爲祖先直接或不是。 欲瞭解更多信息,你可以閱讀the wikibooks on this