Question

J'ai entendu parler d'un moyen de tromper l'héritage simple et d'implémenter l'héritage multiple en Java. Est-ce que quelqu'un sait comment implémenter ceci (sans utiliser d'interface)?

Juste par curiosité ;-)

Était-ce utile?

La solution

Bien sûr que vous le pouvez, mais c'est délicat et vous devriez vraiment vous demander si c'est comme cela que vous voulez aller.
L'idée est d'utiliser un héritage basé sur la portée associé à un héritage basé sur le type. Ce qui est du genre à dire que, pour des raisons internes, les classes internes "héritent" et méthodes et champs de la classe externe. C'est un peu comme mixins, où la classe externe est mélangée à la classe interne, mais pas aussi sûre, car vous pouvez changer l'état de la classe externe et utiliser ses méthodes.
Gilad Bracha (l'un des principaux concepteurs de langage java) a écrit un article sur ce sujet. Supposons donc que vous souhaitiez partager certaines méthodes à usage interne entre certaines classes non liées (par exemple, pour la manipulation de chaînes), vous pouvez en créer des sous-classes en tant que classes internes d'une classe contenant toutes les méthodes nécessaires, et que les sous-classes pourraient utiliser méthodes à la fois de leurs super classes et de la classe externe.

Quoi qu'il en soit, c'est délicat pour les classes complexes et vous pouvez obtenir la plupart des fonctionnalités en utilisant les importations statiques (à partir de java 5). Excellente question pour les entretiens d'embauche et les quiz de pub, cependant; -)

Autres conseils

Single Java ne prend pas en charge l'héritage multiple, mais ses interfaces ont le même objectif. Si vous êtes catégorique pour utiliser l'héritage multiple, vous devez le faire en C ++.

L’utilisation de la composition au lieu de l’héritage tend à être la solution. En fait, cela aide aussi beaucoup avec la testabilité, c'est donc une bonne pratique en général.

Si vous souhaitez simplement que votre type "se comporte". comme plusieurs autres types, vous pouvez cependant hériter d'autant d'interfaces que vous le souhaitez; vous ne pouvez pas "emprunter" détails de la mise en œuvre de ceux-ci, bien sûr.

Je pense que la raison fondamentale pour laquelle Java ne prend pas en charge l'héritage multiple est identique à C #; tous les objets sont finalement dérivés d'Object et le fait qu'il ait plusieurs chemins d'accès à la même classe de base est ambigu pour le compilateur. Ambigu == Bad, donc le compilateur ne le permet pas.

Au lieu de cela, vous pouvez simuler plusieurs héritages par délégation. Voir cet article pour un exemple.

Vous pouvez tricher un peu (et j'insiste un peu) en utilisant des instances de java.lang.reflect.Proxy.

Cela vous permet simplement d'ajouter des interfaces supplémentaires et de déléguer leurs appels à une autre instance lors de l'exécution.

En tant que mentors et tuteurs de nouveaux développeurs, je serais horrifié si quelqu'un me montrait du code qui le faisait. La réflexion est l’un de ces outils que vous devez comprendre et maîtriser parfaitement avant de vous lancer. Personnellement, je ne l’ai jamais fait une seule fois. C’était pour créer du code que je ne maîtrisais pas, mais qui implémentait des interfaces. Un autre code sur lequel je n'avais aucun contrôle m'attendait (c'était un piratage rapide, donc je n'ai pas eu à écrire et maintenir trop de code collant).

Utilisez les interfaces . Vous pouvez en implémenter autant que vous le souhaitez. Vous pouvez généralement utiliser une variante du modèle composé (GoF) pour pouvoir réutiliser le code d'implémentation. si c'est souhaitable.

Vous devez faire attention à distinguer l'héritage d'interface (essentiellement l'héritage d'un contrat fournissant des facilités particulières) de l'héritage d'implémentation (héritage des mécanismes d'implémentation).

Java fournit un héritage d'interface grâce au mécanisme qui implémente et vous pouvez disposer de plusieurs héritages d'interface.

L’héritage d’implémentation est le mécanisme expand et vous n’avez qu’une version unique. Avez-vous vraiment besoin d'un héritage à implémentation multiple? Je parie que vous n'en avez pas, c'est bourré de conséquences désagréables, à moins que vous ne soyez un programmeur Eiffel.

Vous pouvez probablement "simuler". cela en gérant explicitement l'ensemble des superclasses et en utilisant la réflexion pour rechercher la méthode cible dans toutes les superclasses. Je ne voudrais pas faire cela en production, mais cela pourrait être un programme de jouets intéressant. Vous pourriez probablement faire beaucoup de choses étranges en utilisant la réflexion, en créant des classes à la volée et en appelant le compilateur par programmation.

JAVA ne prend pas en charge l'héritage multiple.

Vous pouvez le faire pour implémenter plusieurs interfaces et certains y voient une solution au problème. Personnellement, je n'ai pas encore utilisé l'héritage multiple, je ne comprends donc pas vraiment son attrait.

Normalement, lorsque quelqu'un suggère l'héritage multiple au sein de c # ou de JAVA, cela est dû au fait qu'ils peuvent le faire en c ++. Je suis fan de 'simplement parce que tu ne peux pas faire ce que tu devrais faire'. Comme c # & amp; JAVA ne le supporte pas, pourquoi essayer de le forcer à faire quelque chose pour lequel il n'a pas été conçu. Cela ne veut pas dire qu'il y a des cas uniques où il s'agit d'une technique valide d'empoler, mais le code peut généralement être remanié pour ne pas en avoir besoin.

J'y pensais un peu plus et je me suis rendu compte que si les proxys dynamiques fonctionneraient (c'est ainsi que RMI (utilisé?) fonctionne), si vous voulez vraiment ce type de fonctionnalité, vous feriez mieux de regarder la programmation orientée aspect ( AOP) en utilisant quelque chose comme AspectJ (eclipse.org/aspectj).

De cette façon, vous pouvez intégrer plusieurs aspects différents dans une classe, ce qui vous donne un héritage pseudo-mixin, sans les héritages de héritage extrêmement fragiles.

Comme tout le monde l’a fait remarquer, vouloir / avoir besoin d’un héritage multiple indique généralement que vous n’abordez pas le problème du bon point de vue. Rappelez-vous le principe du GoF selon lequel "préférez la composition à l'héritage". pour commencer!

Un effort a été fait pour importer des mixins en Java. Vérifiez ce lien: http://www.disi.unige.it/person/ LagorioG / jam /

En utilisant Inner Classes, C ++ préfère parfois cela: Inner Idiome de classe .

Oui, vous pouvez dire que c'est une astuce et qu'il est très intéressant de ne pas pouvoir hériter de plusieurs classes dans une seule classe, mais qu'il est possible d'implémenter plusieurs interfaces pour une classe comme

public class parents implements first, second{

}

mais rappelez-vous, vous devez redéfinir les méthodes déclarées dans les interfaces.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top