Ada界面转换?

Ada界面转换?,ada,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;

我正试图基于以下接口在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;
最后,我想让一个工厂方法根据提供的路径创建这些解析器,比如检测它是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中是否有这样做的方法?

您正在尝试返回一个
Parsers.Parser
类型。这是不允许的(也不是你打算做的)。改为
Parsers.Parser'Class

答案是您不返回接口的类型,但返回对象的类型。。。或者,您可以返回接口类,以指示要将其分配给抽象类型变量

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;
程序测试非常重要
软件包接口测试失败
IBob类型为接口;
函数使返回的IBob是抽象的;
函数映像(对象:在IBob中)返回字符串是抽象的;
通用的
类型数据为();
默认_数据:在数据中;
包装容器是
类型数据_容器是新的带私有的IBob;
私有的
类型数据容器是带有记录的新IBob
信息:数据:=默认_数据;
结束记录;
重写函数使返回数据成为容器;
重写函数映像(对象:在数据容器中)返回字符串;
端部容器;
终端接口测试;
包体接口测试失败
包装体容器是
函数Make Return Data_Container为
开始
返回结果:数据容器;
成品;
函数映像(对象:数据容器)返回字符串为
开始
返回数据的图像(Object.Info);
结束图像;
端部容器;
终端接口测试;
包J是新的接口测试容器(整数,1);
使用J型数据容器;
测试:J.数据容器:=J.制造;
使用Ada.Text\u IO;
开始
放线(测试图像);
结束;

+1,但可能应在上展开。在Ada中,如果您指定了一个类型,您将始终得到该类型。如果希望类型为“此类型或从其派生的任何内容”,则需要使用
'class
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;