Generics 从Ada中的两种类型继承

Generics 从Ada中的两种类型继承,generics,inheritance,parent-child,ada,Generics,Inheritance,Parent Child,Ada,假设我有: GENERIC TYPE Item IS PRIVATE; PACKAGE Abstract_something IS TYPE something IS ABSTRACT TAGGED LIMITED PRIVATE; procedure x(...)IS ABSTRACT; procedure y(...)IS ABSTRACT; PRIVATE TYPE something IS ABSTRACT T

假设我有:

GENERIC
   TYPE Item IS PRIVATE;
   PACKAGE Abstract_something IS
      TYPE something IS ABSTRACT TAGGED LIMITED PRIVATE;
      procedure x(...)IS ABSTRACT;
      procedure y(...)IS ABSTRACT;
      PRIVATE
         TYPE something IS ABSTRACT TAGGED LIMITED NULL RECORD;
END Abstract_something;
然后我生了两个孩子

一,

二,

在这里,child和child2都从同一个父级继承,我想创建child3 它的类型something4与something2相同,并从过程Z添加到其中 有些事。 能做到吗?怎么做


谢谢。

Ada不支持多重继承,Ada 2005中的“接口”除外,但它没有关联的类型。根据您所写的内容,您可以通过创建something3的接口来使用这个概念(无论如何,它都有一个空记录,即使您在示例中没有公开它)

有些东西真的需要从抽象的东西继承吗?如果没有,你可以这样做

type something3 is interface;
type something4 is new something2 and something3 with private; -- or with null record etc
根据我的经验,仔细思考当前问题的属性(相对于实现的属性)是值得的:在继承的情况下,整个层次结构中是否存在“is-a”关系?也就是说,当B和C从A继承,D从B和C继承时,每个B和C也是A吗?每个D真的都是a B和a C吗?
“Has-a”不适合继承(尽管粗心的人可能会这样实现)。

您可以使用正交继承,它可能适用于您的用例。您必须将Child2更改为:

GENERIC
   TYPE base IS ABSTRACT NEW something WITH PRIVATE;
PACKAGE Abstract_something.Child2 IS
   TYPE something3 IS ABSTRACT NEW base AND something3_interface WITH PRIVATE;
   PROCEDURE z ( ... ) IS ABSTRACT;
   PRIVATE
      TYPE something3 IS ABSTRACT NEW base AND something3_interface WITH NULL RECORD;
END Abstract_something.Child2;
现在,
something3
中的添加可以应用于继承自
something
的任何类型-您只需使用要继承自的
实例化
Abstract\u something.Child2

something3\u接口是可选的,必须添加到
Abstract\u something

...
TYPE something3_interface IS INTERFACE;
-- Possibly some primitive operations defined by something3_interface here
...

仅当您希望在某个地方使用类型
something3
而不指定
抽象\u某物的实例化时,才需要接口
something3\u interface
,因为它的泛型包有自己的参数,您不能直接使用
something3
以外的
Abstract\u something.Child2

谢谢Ansgar,这里的something2和something3都是某个东西的一个,比如如果某个东西是一个堆栈,我在child中将其实现为链表,然后我在chaild2中添加了某个函数的声明,现在我需要child3,所以我也不会重复代码参见。
GENERIC
   TYPE base IS ABSTRACT NEW something WITH PRIVATE;
PACKAGE Abstract_something.Child2 IS
   TYPE something3 IS ABSTRACT NEW base AND something3_interface WITH PRIVATE;
   PROCEDURE z ( ... ) IS ABSTRACT;
   PRIVATE
      TYPE something3 IS ABSTRACT NEW base AND something3_interface WITH NULL RECORD;
END Abstract_something.Child2;
...
TYPE something3_interface IS INTERFACE;
-- Possibly some primitive operations defined by something3_interface here
...