2015-04-03 59 views
0

如何使用函數初始化Base類型的派生類型?使用函數代替過程初始化派生類型

如果我可以使用function Create而不是程序,它會更好看。在取消

procedure Main is 

    type Base is abstract tagged record 
     Number : Integer; 
    end record; 

    type Base1 is new Base with null record; 
    type Base2 is new Base with null record; 

    --function Create return Base'Class is 
    --begin 
     --return (Number => 1); 
    --end; 

    procedure Create (B : out Base'Class) is 
    begin 
     B.Number := 1; 
    end; 

    B1 : Base1; 
    B2 : Base2; 

begin 

    Create (B1); 
    Create (B2); 

end Main; 

生成結果,當function Create

type of aggreate cannot be class-wide 

我不希望這樣的錯誤。

回答

5

只要知道哪個後代,就沒有什麼可以阻止函數返回抽象標記類型的具體後代的實例。您的Create沒有。

一種方式是提供一個參數說法,其中具體類別:

function Create (Kind : Integer) return Base'Class is 
begin 
    case Kind is 
     when 1 => 
     return Base1'(Number => 1); 
     when others => 
     return Base2'(Number => Kind); 
    end case; 
end Create; 

另一種方法是聲明函數返回Base,這必須是abstract,並重寫爲派生類型。這在一個包做(我用的Ada2012功能,您可以編寫在線功能的實現,如果它很簡單):現在

package Types is 
    type Base is abstract tagged record 
     Number : Integer; 
    end record; 
    function Create return Base is abstract; 

    type Base1 is new Base with null record; 
    function Create return Base1 is ((Number => 1)); 

    type Base2 is new Base with null record; 
    function Create return Base2 is ((Number => 2)); 
end Types; 

,因爲在阿達子程序可以在一個功能調度結果以及有關參數,你可以寫

B4 : Types.Base1 := Types.Create; 
B5 : Types.Base2 := Types.Create; 

與這一個麻煩的是,你只限於參數您在基函數指定的配置文件。


以上全部假設您想要初始化取決於實際的具體類型。如果不是的話,你可以初始化到一個恆定值用一個簡單的初始化:

type Base is abstract tagged record 
    Number : Integer := 42; 
end record; 

或通過函數調用:

type Base is abstract tagged record 
    Time : Ada.Calendar.Time := Ada.Calendar.Clock; 
end record; 
+0

但我只有一個創建功能?所有派生類型的初始化都是相同的。 – Jossi 2015-04-04 14:37:37

+0

我認爲你不能在記錄聲明中使用'Number:= 42;'之類的東西嗎? – 2015-04-04 20:48:52

+0

是的,適用於常量,但我對動態分配感興趣。 – Jossi 2015-04-04 21:17:14

相關問題