2012-07-22 74 views
1

我想基於以下接口一組解析器Ada中的模型:Ada接口鑄造?

package Parsers is 

    type Parser is interface; 
    type DataArray is array(Integer range <>) of String(1..100); 

    function Parse(Object : access Parser; FilePath : String) return DataArray is abstract; 

end Parsers; 

第一分析器接口成員低於文本分析器顯示:

with Parsers; 

package TextParsers is 
    type Parser is new Parsers.Parser with null record; 

    overriding function Parse(Object : access Parser; FilePath : String) return Parsers.DataArray; 
    end TextParsers;          

with Parsers; 
use Parsers; 

package body TextParsers is 

    overriding function Parse(Object : access Parser; FilePath : String) return Parsers.DataArray is 
     Data : Parsers.DataArray (0..144); 
    begin 
     -- just stubbed out 
     return Data; 
    end Parse; 
end TextParsers; 

最後,我想有一個工廠方法創建基於路徑上的這些解析器提供,例如,檢測,如果它是一個txt文件或者一個CSV等。這裏是工廠代碼:

with Parsers; 
use Parsers; 

package ParserFactories is 
    function GetParser(Path : String) return Parsers.Parser; 
end ParserFactories; 


with Parsers, TextParsers; 

package body ParserFactories is 
    function GetParser(Path : String) return Parsers.Parser is 
     Text : TextParsers.Parser; 
     Parse : Parsers.Parser'Class := Text; 
    begin 
     return Parse; 
    end GetParser; 
end ParserFactories; 

我不斷收到「動態標記的表達式不允許」編譯器錯誤,我無法弄清楚如何創建這些實現解析器接口並將其從此函數中返回的對象。有沒有辦法在Ada中做到這一點?

回答

2

您正試圖返回Parsers.Parser類型。這是不允許的(而不是你打算做的)。改爲改爲Parsers.Parser'Class

+1

+1,但應該可以擴展。在Ada中,如果你指定一個類型,你將總是得到那種類型。如果你想讓這個類型成爲「這個類型或從它派生的任何東西」,你需要使用''class'。 – 2012-07-23 17:19:21

1

答案是,您不返回接口的類型,但是該對象的類型是...或者您可以返回接口的類來指示您將它分配給該抽象類型,類型變量。

Procedure Testing is 

package Interface_Test is 
    Type IBob is interface; 
    Function Make Return IBob is abstract; 
    Function Image(Object : In IBob) Return String is abstract; 

    Generic 
     Type Data is (<>); 
     Default_Data : In Data; 
    Package Container is 
     Type Data_Container is NEW IBob with private; 
    private 
     Type Data_Container is new IBob with record 
     Info : Data:= Default_Data; 
     end record; 

     Overriding Function Make Return Data_Container; 
     Overriding Function Image(Object : In Data_Container) Return String; 
    end Container; 
end Interface_Test; 

package Body Interface_Test is 
    Package Body Container is 

     Function Make Return Data_Container is 
     begin 
     Return Result : Data_Container; 
     end Make; 

     Function Image(Object : Data_Container) Return String is 
     begin 
     return Data'Image(Object.Info); 
     end image; 

    end Container; 
end Interface_Test; 


package J is new Interface_Test.Container(Integer, 1); 
use type J.Data_Container; 
Test : J.Data_Container:= J.Make; 

Use Ada.Text_IO; 

Begin 
    put_line(Test.Image); 
End;