наследовать от двух типов в Аде - PullRequest
0 голосов
/ 17 января 2012

предположим, у меня есть:

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;

тогда я делаю двоих детей

1

GENERIC
   PACKAGE Abstract_something.Child IS
      TYPE something_2  IS ABSTRACT NEW something WITH PRIVATE;
      PROCEDURE x(...);
      PROCEDURE y(...);
      FUNCTION  xx(...) RETURN whatever1;
      error: EXCEPTION;
      PRIVATE
         TYPE something_2  IS ABSTRACT NEW something WITH RECORD
            some declarations here..
         END RECORD;
END Abstract_something.Child;

2

GENERIC
PACKAGE Abstract_something.Child2 IS
   TYPE something3 IS ABSTRACT NEW something WITH PRIVATE;
   PROCEDURE z ( ... ) IS ABSTRACT;
   PRIVATE
      TYPE something3 IS ABSTRACT NEW something WITH NULL RECORD;
END Abstract_something.Child2;

здесь child и child2 наследуются от одного родителя, и я хочу создать child3 имеет тип что-то4, идентичное чему-то2, и добавляет к нему процедуру Z из something3. это можно сделать? и как?

спасибо.

Ответы [ 2 ]

1 голос
/ 17 января 2012

Ada не поддерживает множественное наследование, за исключением «Интерфейсов» в Ada 2005, которые, однако, не имеют ассоциированного типа. Исходя из того, что вы написали, вы можете использовать эту концепцию, создав интерфейс чего-то3 (в любом случае он имеет нулевую запись, даже если вы не раскрываете это в своем примере).

Что-то действительно нужно наследовать от Abstract_something? Если нет, вы могли бы сделать

type something3 is interface;
type something4 is new something2 and something3 with private; -- or with null record etc

Исходя из моего опыта, стоит задуматься о том, каковы на самом деле свойства рассматриваемой проблемы (в отличие от свойств реализации): в случае наследования существуют ли отношения "есть-а" на протяжении всей иерархия? То есть, когда B и C наследуют от A, а D наследует от B и C, каждый ли B и C также является A? Является ли каждый D действительно B и C? «Has-a» не поддается наследованию (хотя неосторожный может реализовать его таким образом).

0 голосов
/ 18 января 2012

Вы можете использовать ортогональное наследование, оно может применяться к вашему варианту использования.Вам нужно изменить 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_something.Child2 с помощью base вы хотите наследовать - например, something_2.

something3_interface не является обязательным и должен быть добавлен к Abstract_something:

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

Вам нужен интерфейс something3_interface только если вы хотите где-то использовать тип something3 без указания экземпляра Abstract_something.Child2 - поскольку его универсальный пакет имеет собственный параметр, вы не можете использовать something3 непосредственно вне Abstract_something.Child2.

...