首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ada接口转换?

Ada接口转换?
EN

Stack Overflow用户
提问于 2012-07-23 02:40:23
回答 2查看 825关注 0票数 1

我正在尝试在Ada中基于以下接口对一组解析器进行建模:

代码语言:javascript
复制
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;

第一个解析器接口成员是文本解析器,如下所示:

代码语言:javascript
复制
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文件等等。

代码语言:javascript
复制
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中做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2012-07-23 16:11:53

您正在尝试返回Parsers.Parser类型。这是不允许的(也不是您想要做的)。改为Parsers.Parser'Class

票数 2
EN

Stack Overflow用户

发布于 2012-08-11 01:16:46

答案是您不返回接口的类型,而是返回对象的类型...或者,您可以返回接口的类,以指示您将把它赋给那个抽象类型的变量。

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11602973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档