1

以下のインターフェイスに基づいて、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;

最初の Parser インターフェイス メンバーは、以下に示すテキスト パーサーです。

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でこれを行う方法はありますか?

4

2 に答える 2

2

Parsers.Parserタイプを返そうとしています。これは許可されていません (意図したことではありません)。代わりに変更しParsers.Parser'Classます。

于 2012-07-23T08:11:52.633 に答える
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;
于 2012-08-10T17:16:45.740 に答える