Interface 实现类似ADA95接口的最佳方式是什么?

Interface 实现类似ADA95接口的最佳方式是什么?,interface,ada,ada95,Interface,Ada,Ada95,我想使用ADA95实现类似于接口的东西,因此典型的OO接口不可用。我通过在记录中使用泛型和一组指向方法的指针实现了这一点。代码如下 编辑:我知道可以通过将子程序作为形式参数传递给泛型包来完成,但我希望避免向它传递太多参数 我认为一定有更好的方法来实现我想要的,所以如果我是对的,我希望看到一个代码示例 接口在名为Drivers的通用包中声明。其中,有一条记录包含表示驱动程序的泛型变量,还有一条记录包含其操作: 广告 通用的 T型为私有型; 类型错误是私有的; 未实现\u代码:错误; 包驱动程序是

我想使用ADA95实现类似于接口的东西,因此典型的OO接口不可用。我通过在记录中使用泛型和一组指向方法的指针实现了这一点。代码如下

编辑:我知道可以通过将子程序作为形式参数传递给泛型包来完成,但我希望避免向它传递太多参数

我认为一定有更好的方法来实现我想要的,所以如果我是对的,我希望看到一个代码示例

接口在名为Drivers的通用包中声明。其中,有一条记录包含表示驱动程序的泛型变量,还有一条记录包含其操作:

广告 通用的 T型为私有型; 类型错误是私有的; 未实现\u代码:错误; 包驱动程序是 类型驱动程序是私有的; -需要声明这些类型,因为我使用ADA95编译。 ToStringPtr类型是访问函数self:in T返回字符串; 类型ReadLinePtr是访问过程本身:在T中;缓冲区:输出字符串;错误:输出错误; DriverOps类型为 记录 to_string_op:ToStringPtr:=null; read_line_op:ReadLinePtr:=null; 结束记录; 函数create_driverunderlieng:T;ops:驾驶员ROPS返回驾驶员; 函数到_stringself:在驱动程序返回字符串中; 程序读取:在驱动程序中;缓冲区:输出字符串;错误:输出错误; 私有的 类型驱动程序是 记录 基础:T; 操作:驱动ROPS; 结束记录; 终端驱动器; 亚洲开发银行 包体驱动程序是 函数create_driverunderlieng:T;操作:驱动ROPS返回驱动程序已关闭 开始 回报率,ops; 端创建驱动程序; 函数to_stringself:在驱动程序中返回字符串为 开始 如果self.ops.to_string_op/=null,则 返回self.ops.to_string_opself.undernative; 其他的 回来 如果结束; 端到端字符串; 程序读取:在驱动程序中;缓冲区:输出字符串;错误:输出错误为 开始 如果self.ops.read\u line\u op/=null,则 self.ops.read_line_opself.underlined,buffer,err; 其他的 错误:=未实现\u代码; 如果结束; 结束读取线; 终端驱动器; main.adb 使用Ada.Text_IO;使用Ada.Text\u IO; 使用Ada.Strings.Fixed; 与司机; 主要程序是 类型错误为成功,未实现,未知; 类型MyInt是新的整数; 函数to_stringself:in MyInt返回字符串为 开始 返回整数'Image Integerself;-' 端到端字符串; 程序读取:以MyInt为单位;缓冲区:输出字符串;错误:输出错误为 开始 Ada.Strings.Fixed.Move 目标=>缓冲区, Source=>假设我们已经从一个设备&ASCII.LF读取了它, Pad=>ASCII.NUL; 错误:=成功; 结束读取线; 包IntDrivers是新的DriversMyInt,错误,未实现; 使用INT驱动程序; 基础:MyInt:=25; 内部驱动程序操作:驱动程序: to_string_op=>to_string'access,' read_line_op=>read_line'access-' ; my_driver:driver:=创建_driverrunderlieng,int_driver_ops; 缓冲区:String1..256:=其他=>字符'Val0;-' err:Error:=成功; 开始 将线路连接到我的驱动器; 读取我的驱动程序、缓冲区、错误; Putbuffer; Put_LineError'Imageerr;-' 端干管;
我所知道的唯一一个是下面描述的,可能不是规范的。这不是严格意义上的接口继承,但它可以让您朝着正确的方向前进。 它需要使用带鉴别标记的记录

诀窍是定义2个标记类型。一个是您的经典类定义,另一个用作接口继承

然后,您可以操作一个对象,该对象允许使用判别式访问接口约定和类约定。在同一个包中声明这两个组件应该可以让您完全了解私有部分,有待确认

简言之:

type InterfaceX is abstract ....; -- abstract class and services

type ClassA is tagged ...; -- or is new ....
type Trick (component : ClassA) is new InterfaceX ...; -- this type gives you access to classA and interfaceX primitives
技巧对象实现你的InterfaceX合同

您必须为ClassA对象或Trick对象定义实例化/访问器。我认为类型也应该受到限制

我经常听到人们叫这个罗森把戏,我猜它是以J.-p.罗森的名字命名的

也许您会在这里找到一些更精确的答案

在Ada 95中,接口是一个抽象标记的空记录:

包抽象_驱动程序是 类型实例为抽象标记的空记录; 子类型类是实例'Class;-'缺陷语法荧光笔 函数映像项:实例中返回字符串为抽象字符串; 程序读取行项目:输入输出实例; 缓冲区:输出字符串是抽象的; 端驱动程序; 具有抽象驱动程序; 程序包文本\u IO\u驱动程序不可用 子类型父项是抽象的驱动程序 立场 类型实例是私有的新父级; 子类型类是实例'Class;-'缺陷语法荧光笔 函数图像项:实例内返回字符串; 缓冲区太小:异常; 程序读取行项目:输入输出实例; 缓冲区:输出字符串; 私有的 类型实例为空记录的新父级; 结束文本输入输出驱动程序; 使用Ada.Text_IO; 包体文本\u IO\u驱动程序是 函数映像项:实例中的返回字符串为 开始 返回Ada.Text\u IO.Standard\u输入; 结束图像; 程序读取行项目:输入输出实例; 缓冲区:输出字符串为 最后:自然; 开始 缓冲区:=缓冲区范围=>'';-'缺陷语法荧光笔 Ada.Text\u IO.Get\u行项目=>Buffer, Last=>Last; 如果Last=Buffer'Last then-'缺陷语法高亮显示 将缓冲器升得太小; 如果结束; 结束读取线; 结束文本输入输出驱动程序;
当你说“接口”时,你指的是OO编程概念,与Java中的关键字“接口”类似?没错,但我不能使用OO,因为我使用的是Ada 95..Ada 95是第一种标准化的面向对象编程语言,所以你当然可以将OO与Ada 95一起使用。谢谢,但我使用的是Ada 95,因此,我不能使用标记记录。Ada 95中有AFAIK标记类型。请参阅《Ada 95参考手册》§3.9标记类型和类型扩展支持面向对象编程,基于继承和扩展,并通过调度操作支持运行时多态性。@Dan Ada 95是第一种标准化的面向对象编程语言,因此,当然可以将OO与ADA95结合使用。