Interface 实现类似ADA95接口的最佳方式是什么?
我想使用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;-' 端干管;Interface 实现类似ADA95接口的最佳方式是什么?,interface,ada,ada95,Interface,Ada,Ada95,我想使用ADA95实现类似于接口的东西,因此典型的OO接口不可用。我通过在记录中使用泛型和一组指向方法的指针实现了这一点。代码如下 编辑:我知道可以通过将子程序作为形式参数传递给泛型包来完成,但我希望避免向它传递太多参数 我认为一定有更好的方法来实现我想要的,所以如果我是对的,我希望看到一个代码示例 接口在名为Drivers的通用包中声明。其中,有一条记录包含表示驱动程序的泛型变量,还有一条记录包含其操作: 广告 通用的 T型为私有型; 类型错误是私有的; 未实现\u代码:错误; 包驱动程序是
我所知道的唯一一个是下面描述的,可能不是规范的。这不是严格意义上的接口继承,但它可以让您朝着正确的方向前进。 它需要使用带鉴别标记的记录 诀窍是定义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结合使用。