Éviter les formes losanges en Java lors de l'utilisation de la composition et de l'héritage


J'ai construit un système qui a cinq classes, avec une autre classe contenant la méthode principale pour initialiser, afficher et modifier divers objets différents des cinq classes susmentionnées. Je comprends comment utiliser l'héritage pour adopter des champs dans les classes thérapeute et patient de la personne (par exemple nom, adresse phonenumber champs) classe parent, et comment utiliser la composition (au moins théoriquement) pour construire des objets de consultation et de facture à partir de la classe patient.

Cependant, je suis confus sur la façon dont je devrais stocker un champ appelénom du thérapeute dans la classe du thérapeute et montrer que lorsque j'appelle un objet de patient. J'ai inclus un diagramme de classe sur la façon dont je pense que cela devrait être comme, mais apparemment cela forme un diamant qui est un grand non-non en java. Est-ce que quelque chose comme ce qui est dans mon diagramme de classe fonctionnerait même?

Quelqu'un pourrait-il montrer un exemple de la façon dont je stocke le nom du thérapeute dans la classe du thérapeute, puis déplacer ce membre de données vers le patient lorsque je crée ses objets?

Voici un diagramme:

lien

Author: Radiodef, 2015-05-14

2 answers

Le problème du diamant n'existe pas vraiment pour Java, car Java ne prend en charge que l'héritage multiple de signature, pas l'implémentation (bien que je ne sache pas comment cela fonctionne avec les méthodes par défaut de l'interface Java 8-je ne les ai pas encore complètement dérangées). Le problème du diamant dans les langages multi-héritage-d'implémentation fait référence au problème d'une classe héritant de la même classe grand-parent via deux classes parentes différentes. En C++, par exemple, vous obtiendrez soit le petit-enfant ayant deux instances de grand-parent distinctes (une par classe parent), vous pouvez donc obtenir deux résultats différents en convertissant votre objet en grand-parent, en fonction du parent d'où provient la distribution; ou vous aurez une seule instance de grand-parent, partagée par les deux parents who qui pourrait mettre à jour le grand-parent en utilisant une sémantique

Dans ce cas, si vous souhaitez ajouter un champ therapistName à Patient, ajoutez simplement un champ appelé therapistName et initialisez-le via un paramètre constructeur ou un setter. Il n'y a pas de problème ici.

Bottom line: le motif diamant n'est qu'un non-non pour l'héritage multiple de l'implémentation, que Java ne prend pas en charge (encore une fois, en excluant éventuellement les méthodes par défaut de l'interface). Un diamant causé par la composition n'est pas un antipattern, ni susceptible de vous causer de la douleur, à part peut-être rendre la logique d'initialisation et/ou d'élimination plus lourde.

 1
Author: Dathan, 2015-05-13 23:06:31

Comme déjà mentionné à propos du diamant que vous craigniez, je voulais faire quelques marques sur votre diagramme.

Vérifiez les flèches ci-dessous.

Et à propos de la composition vous vous trompez, la relation entre le patient et le thérapeute est une relation d'agrégation. Une relation de composition, vous pouvez le voir plus comme "partie de". J'ai écrit un fil simple à ce sujet aussi ici, lisez: Est-ce une agrégation?

entrez la description de l'image ici

 0
Author: MrSimpleMind, 2017-05-23 12:19:43