我想基于以下接口一组解析器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中做到这一点?
+1,但应该可以扩展。在Ada中,如果你指定一个类型,你将总是得到那种类型。如果你想让这个类型成为“这个类型或从它派生的任何东西”,你需要使用''class'。 – 2012-07-23 17:19:21