наследовать от двух типов в Аде

допустим у меня есть:

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;

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

Спасибо.


person jim smithson    schedule 17.01.2012    source источник
comment
См. также Обоснование Ады 2005: §2.4 Интерфейсы.   -  person trashgod    schedule 18.01.2012


Ответы (2)


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

Действительно ли something3 нужно наследовать от 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" не поддается наследованию (хотя неосторожный может реализовать его таким образом).

person Ansgar Esztermann    schedule 17.01.2012
comment
спасибо Ансгар, здесь что-то2 и что-то3 оба являются IS-A чего-то - например, если что-то является стеком, и я реализую его как связанный список в дочернем элементе, а затем я добавил объявление некоторой функции в chaild2, и теперь мне нужен дочерний элемент3, поэтому я не буду повторяющийся код - person jim smithson; 17.01.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.

person flyx    schedule 18.01.2012