2010-03-03 6 views
3

Supposons que je les suivantes:Héritage Type Multiple Ada

type blah is abstract tagged 
record 
element1 : integer; 
end record; 

type blah2 is abstract tagged 
record 
element2 : integer; 
end record; 

J'espère qu'il est possible que je peux faire quelque chose comme ceci:

type blah3 is abstract new blah1 and blah 2 with null record; 

Donc, en théorie je peux maintenant accès blah3.element1 et blah3.element2

Est-ce possible? et des conseils ou des astuces?

MISE À JOUR:

Serait-il possible de références les éléments de blah3 (contenant blah et blah2) à l'aide des pointeurs?

I.E. (Ce qui est juste un code vague idée est terrible ... LOL)

type blah3 is new type with 
record 
element1 : ptr to blah.element1; 
element2 : ptr to blah2.element2; 
end record 

et sont alors en mesure d'être accessible via blah3.element1 par exemple?

+2

En bref, non, l'héritage multiple n'est pas possible dans Ada de la manière que vous espérez. Des analogies proches sont possibles en utilisant "mixins" et l'héritage d'interface, mais je n'ai pas beaucoup fait dans ces domaines, donc je ne veux pas donner de conseils sans expérience pour le sauvegarder (pas que ça arrête la plupart des blogueurs :-). Quel est le problème que vous essayez de résoudre? Peut-être qu'il y a une bonne solution qui n'implique pas l'IM. –

+0

Je vais essayer ... –

+0

Le but est de garder un "paquet" particulier en boîte noire, I.E. l'enregistrement Blah 3 est l '"appel" typique à notre paquet, mais certains événements ont provoqué la mise en deux types de données, l'espoir étant de les unifier d'une manière ou d'une autre, afin que nous puissions laisser l'appel initial seul travaille toujours pour les gens de l'extérieur qui essaient d'appeler. J'espère que cela a du sens. – onaclov2000

Répondre

4

Marc C a raison (comme d'habitude).

Direct L'héritage multiple est très contraversial même dans les langues qui le supportent. Il y a de gros problèmes concernant ce que le compilateur est supposé faire dans certains cas, comme lorsque les deux classes parent définissent des versions différentes de la même méthode ou du même membre. Il était explicitement et non autorisé dans Ada95 quand ils ont ajouté l'héritage.

Alors votre prochaine question sera "Alors, comment je fais ce que je veux faire?"

Cela dépend de ce que vous essayez d'obtenir en utilisant l'héritage multiple. Dans le pire des cas (le plus compliqué), vous pouvez généralement obtenir l'effet que vous recherchez avec l'héritage "mixin". Je l'ai fait auparavant, mais je pense qu'il est mieux expliqué dans cet article AdaIC: Ada95 and Multiple Inheritance que je pouvais faire moi-même.

est ici un condensé:

Ada 95 prend en charge l'héritage multiple inclusion du module (via plusieurs "avec"/"utiliser" clauses), l'héritage multiple "est mis en œuvre, en utilisant" via extensions et la composition de l'enregistrement, et mix-ins à plusieurs héritages via l' l'utilisation de génériques, les paquets formels, et discriminants d'accès.

Il semble qu'Ada 2005 offre un autre moyen plus simple de le faire («interfaces»), mais je n'ai pas encore eu l'occasion de l'essayer. Vous pouvez en lire plus à ce sujet (y compris pourquoi MI direct est encore considéré comme mauvais dans Ada) here. J'ai trouvé cet exemple. Encore une fois, cela ne fonctionnera que si votre compilateur prend en charge Ada 2005

Interfaces can be composed from other interfaces thus 
type Int2 is interface; 
... 
type Int3 is interface and Int1; 
... 
type Int4 is interface and Int1 and Int2; 
... 
+0

Malheureusement, Ada a 95 ans, je crois, nous ne pouvons pas aller à 2005 .... – onaclov2000

+0

Je pense que vous devez aller la route mixin alors. J'ai vu une présentation il y a * ans * et c'était assez élégant. –

+0

Lisez d'abord le premier article lié. Il a été écrit par le père d'Ada95, et va dans les moindres détails sur la façon de faire l'héritage mixin avec (avec des exemples). –