2013-05-30 3 views
0

Récemment, j'ai trouvé un problème déroutant: Disons que j'ai une hiérarchie de classes C ... C_ n. Supposons qu'au moins certaines classes ont plusieurs classes enfants (directes), mais aucune n'a plus d'un parent (c'est-à-dire pas d'héritage multiple). Je voudrais changer le comportement de la hiérarchie. Mon premier mouvement serait de créer des sous-classes D ... D n et remplacer les méthodes que nécessaire, mais il y a un problème: lors de l'appel d'une nouvelle méthode substituée, une D réelle i peut-être besoin d'être passé en un formel D (ou un certain niveau entre les deux); ceci peut être résolu en classant C1 -> D1 -> D2 .... Mais lorsque vous appelez une méthode inchangée, toute D réelle i devra être passé en C formel i, donc on aurait pu tirer chaque D i directement à partir de Ci. Y a-t-il une manière élégante ou généralement acceptée de résoudre cette énigme? Si oui, y a-t-il un moyen sans avoir recours à l'héritage multiple?Extension d'une hiérarchie de classes

S'il n'y a pas de façon générale d'y parvenir, l'auteur de la hiérarchie C originale peut-il suivre certaines règles pour fournir cette possibilité?

Pour ceux qui préfèrent une approche plus pratique, la hiérarchie d'origine implémente SOAP dans Ada. Je travaille sur XML-RPC. D'un point de vue abstrait, SOAP est un sur-ensemble à XML-RPC, mais le XML actuel "sur le fil" est assez différent. En principe, on peut effectuer la plupart du travail en rejetant certains des types de données (par exemple, XML-RPC a un entier et un type virgule flottante alors que SOAP en a plusieurs), et remplace les routines qui convertissent les types restants en à partir de XML. Cependant, en raison des problèmes d'héritage mentionnés ci-dessus, j'ai fini par copier presque toute la hiérarchie SOAP. Le seul code que j'ai pu réutiliser correctement s'est avéré être la partie HTTP (car il ne concerne pas seulement les charges de texte, pas les objets SOAP).

[Edit: Suppression d'une hypothèse qui permettrait une solution simple qui simplifie pas applicable au problème plus général]

Répondre

2

La solution, parce que vous assumez l'héritage unique, et les relations de sous-classe directe, est de créer simplement D (1) en tant que sous-classe de C (n), auquel cas tous les D seront également dans chaque classe C.

En pratique, la solution n'est pas de créer des hiérarchies de classes profondes sans raison. Si vous aimez vraiment les petites classes, utilisez un système qui accepte l'héritage multiple sous une forme ou une autre.

+0

+1 pour la réponse rapide et la solution simple. Malheureusement, ce n'est que simple parce que j'ai trop simplifié, ne pensant pas que cela introduirait de nouvelles solutions. –

+0

@AnsgarEsztermann Pas vraiment. Je ne pense pas que ce problème existe réellement, et je vous mets au défi de montrer une hiérarchie là où elle se présente. – Marcin

Questions connexes