La différence entre l'Héritage et la Composition
Sont la Composition et l'Héritage de la même manière?
Si je veux mettre en œuvre la composition de modèles, comment puis-je le faire en Java?
- Autres question: Est-il rien de composition ne peut accomplir que l'héritage peut? stackoverflow.com/questions/2238642/...
- Voir aussi is-a-vs-has-a-which-one-is-better
- Cet article a été utile pour moi et m'a aidé: thoughtworks.com/insights/blog/...
Vous devez vous connecter pour publier un commentaire.
Ils sont absolument différentes. L'héritage est un "est-un" relation. La Composition est un "a-un".
Vous n'composition de disposer d'une instance d'une autre classe
C
comme un champ de votre classe, au lieu de l'étendreC
. Un bon exemple de cas où la composition aurait été beaucoup mieux que l'héritage estjava.util.Stack
, qui s'étend actuellementjava.util.Vector
. Ce qui est maintenant considéré comme une faute. Une pile "est-PAS-un" vecteur; vous ne devriez pas être autorisé à insérer et supprimer des éléments de manière arbitraire. Il aurait été de la composition à la place.Malheureusement il est trop tard pour rectifier cette erreur de conception, puisque la modification de la hiérarchie d'héritage, maintenant casser la compatibilité avec le code existant. Avait
Stack
utilisé composition à la place de l'héritage, il peut toujours être modifié pour utiliser une autre structure de données sans violer l'API.Je recommande fortement Josh Bloch livre Efficace Java 2nd Edition
Bonne conception orientée objet n'est pas sur-le généreusement l'extension de classes existantes. Votre premier réflexe doit être de composer à la place.
Voir aussi:
Composition signifie
HAS A
L'héritage signifie
IS A
Example
: Voiture a un Moteur et la Voiture est un AutomobileDans la programmation c'est représentée sous la forme d'
:-/
type
champ de TypeEnum
La façon dont l'héritage peut-il être dangereux ?
Permet de prendre un exemple
1) en clair dans le code ci-dessus , la Classe Y a un très fort couplage avec la classe de X. Si rien ne change dans la super-classe X , Y peut rompre de façon spectaculaire. Supposons que Dans l'avenir la classe X met en œuvre une méthode de travail avec les dessous de la signature
Est fait dans la classe X, mais il fera de la classe Y uncompilable. DONC, cette forme de dépendance peut aller jusqu'à n'importe quel niveau et il peut être très dangereux. Chaque fois que super-classe peut ne pas avoir une visibilité complète de code à l'intérieur de l'ensemble de ses sous-classes et sous-classe peut être continuer à observer ce qui se passe dans la super-classe de tous les temps. Nous devons donc éviter cette forte et inutile de couplage.
Comment la composition permet de résoudre ce problème?
Permet de voir en révisant le même exemple
Ici, nous créons de référence de la classe X dans Y de la classe et de l'invocation de la méthode de la classe X par la création d'une instance de la classe X.
Maintenant, tout ce que le couplage fort est allé. Super-classe et sous-classe sont très indépendants les uns des autres maintenant. Les Classes peuvent librement faire des modifications qui ont été dangereux dans l'héritage de la situation.
2) Deuxième très bon parti de la composition en ce qu'Il prévoit l'appel de méthode de flexibilité, par exemple :
Dans la classe de Test à l'aide de r référence que je peux appeler des méthodes de X et Y de la classe. Cette flexibilité n'a jamais été là, dans l'héritage
3) un Autre grand avantage : les tests Unitaires
Dans l'exemple ci-dessus, si l'état de x instance n'est pas connu, il peut facilement se moque de lui à l'aide de quelques données de test et toutes les méthodes peuvent être facilement testés. Ce n'était pas possible dans l'héritage que vous ont été fortement tributaire de la superclasse pour obtenir l'état de l'instance et d'exécuter n'importe quelle méthode.
4) une Autre bonne raison pourquoi on devrait éviter l'héritage est que Java ne supporte pas l'héritage multiple.
Prenons un exemple pour comprendre ceci :
Bon à savoir :
composition est facile à réaliser au moment de l'exécution, tandis que l'héritage donne ses caractéristiques au moment de la compilation
composition est également connu comme A-UNE relation et l'héritage est également connu comme UN rapport
Donc prenez l'habitude de toujours préférant la composition au cours de l'héritage, pour diverses raisons ci-dessus.
La réponse donnée par @Michael Rodrigues n'est pas correct (je m'excuse, je ne suis pas en mesure de commenter directement), et pourrait conduire à une certaine confusion.
L'implémentation de l'Interface est une forme d'héritage... lors de l'implémentation d'une interface, vous n'êtes pas seulement hériter de tous les constantes, vous vous engagez votre objet du type spécifié par l'interface, c'est toujours un "est-un" de la relation. Si une voiture met en œuvre à Remplir, la voiture "est-un" à Remplir, et peut être utilisé dans votre code chaque fois que vous utilisez une à Remplir.
Composition est fondamentalement différente de l'héritage. Lorsque vous utilisez la composition, vous êtes (comme les autres réponses note) de faire un "a-un" relation entre deux objets, par opposition à la "est-un" la relation que vous faites lorsque vous utilisez l'héritage.
Donc, à partir de la voiture des exemples pour les autres questions, si je voulais dire qu'une voiture "a-un" réservoir de gaz, je voudrais utiliser la composition, comme suit:
J'espère que ça efface tout malentendu.
Héritage apporte EST-UN relation. Composition apporte A-UNE relation.
Modèle de stratégie d'expliquer que la Composition doit être utilisé dans les cas où il y a des familles d'algorithmes de la définition d'un comportement particulier.
Exemple classique étant d'un canard de la classe qui implémente un comportement de vol d'.
Ainsi, nous pouvons avoir plusieurs classes qui implémentent volant
par exemple:
Avait-il été pour l'héritage, nous avons deux classes différentes d'oiseaux qui mettent en œuvre la volée en fonction, encore et encore. Donc, l'héritage et la composition sont complètement différents.
Composition est juste comme il sonne - vous de créer un objet en le branchant dans les pièces.
MODIFIER le reste de cette réponse est, à tort, basée sur le postulat suivant.
Ceci est accompli avec les Interfaces.
Par exemple, à l'aide de la
Car
exemple ci-dessus,Donc, avec un peu de la norme théorique des composants, vous pouvez construire votre objet. C'est votre travail pour remplir un
House
protège ses occupants, et comment unCar
protège ses occupants.Héritage, c'est comme l'autre manière autour. Vous commencez avec une complète (ou semi-complète) de l'objet et vous le remplacer ou Remplacer les divers éléments que vous souhaitez modifier.
Par exemple,
MotorVehicle
peut venir avec unFuelable
méthode etDrive
méthode. Vous pouvez laisser le Carburant méthode que c'est parce que c'est la même chose pour remplir une moto et une voiture, mais vous pouvez remplacer leDrive
méthode parce que la Moto lecteurs très différemment à unCar
.Avec l'héritage, certaines classes sont complètement mis en œuvre déjà, et d'autres méthodes qui vous êtes amené à remplacer. Avec la Composition rien n'est donné. (mais vous pouvez mettre en Œuvre les interfaces par des appels de méthodes dans d'autres classes, si vous avez quelque chose autour de la pose).
Composition est considérée comme plus souple, parce que si vous avez une méthode telle que iUsesFuel, vous pouvez avoir une méthode à un autre endroit, une autre classe, un autre projet) qui vient de soucis à propos des relations avec les objets pouvant être alimenté, qu'il s'agisse d'une voiture, bateau, cuisinière, barbecue, etc. Interfaces mandat que les classes qui implémentent cette interface effectivement les méthodes de cette interface est tout au sujet. Par exemple,
alors vous pouvez avoir une méthode quelque part d'autre
Étrange exemple, mais c'est la montre que cette méthode ne se soucie pas de ce qu'il se remplit, parce que l'objet implémente
iUsesFuel
, il peut être rempli. Fin de l'histoire.Si vous avez utilisé l'Héritage au lieu de cela, vous avez besoin de différents
FillHerUp
méthodes pour faire face àMotorVehicles
etBarbecues
, sauf si vous avez eu assez bizarre "ObjectThatUsesFuel" objet de base à partir de laquelle hériter.ThisCase
, pas danscamelCase
. Par conséquent, il est préférable de nom de vos interfacesIDrivable
, etc. Vous ne pourriez pas besoin le "je" si vous regrouper toutes vos interfaces dans un paquet correctement.Ils ne sont pas les mêmes.
Composition : Il permet à un groupe d'objets doivent être traités de la même façon qu'une seule instance d'un objet. L'intention d'un composite est de "composer" des objets dans une structure d'arbre à représentent la partie-ensemble de hiérarchies
L'héritage: Une classe hérite des champs et des méthodes à partir de l'ensemble de ses super-classes, qu'elle soit directe ou indirecte. Une sous-classe peut remplacer les méthodes qu'il hérite, ou il peut masquer des champs ou méthodes qu'il hérite.
Wikipédia l'article est assez bon pour mettre en œuvre composite modèle en java.
Des Participants Clés:
Composant:
Feuille:
Composite:
Exemple de Code pour comprendre Composite modèle:
de sortie:
Explication:
Consultez ci-dessous la question pour les Pros et les Inconvénients de Composition et d'Héritage.
Préférez la composition au cours de l'héritage?
comme autre exemple, prenons une classe de voiture, ce serait une bonne utilisation de la composition, une voiture aurait "" un moteur, une transmission, pneus, sièges, etc. Il ne serait pas étendre l'une de ces classes.
En Mot Simple Agrégation des moyens A Une Relation ..
Composition est un cas particulier de l'agrégation. Une manière plus précise, une restriction de l'agrégation est appelé composition. Lorsqu'un objet contient l'autre objet, si l'objet ne peut pas exister sans l'existence de l'objet conteneur, puis il est appelé composition.
Exemple: Une classe contient des étudiants. Un étudiant ne peut pas exister sans une classe. Il existe de composition entre la classe et les élèves.
Pourquoi Utiliser L'Agrégation
Réutilisabilité Code
Lors De L'Utilisation De L'Agrégation
La réutilisation de Code est également mieux assurée par l'agrégation lorsqu'il n'existe pas une Relation
Héritage
L'héritage est une Relation de Parent-Enfant d'Hérédité Est Une Relation
L'héritage en java est un mécanisme dans lequel un objet acquiert toutes les propriétés et le comportement de l'objet parent.
L'utilisation de l'héritage en Java
1 Code De Réutilisabilité.
2 Ajouter un élément Supplémentaire dans la Classe Enfant ainsi que la redéfinition de Méthode (donc polymorphisme d'exécution peut être atteint).
Composition est l'endroit où quelque chose est composée de parties distinctes et il a une relation forte avec ces pièces. Si la partie principale meurt les autres, ils ne peuvent pas avoir une vie qui leur est propre. Un exemple grossier est le corps humain. Prenez le coeur et toutes les autres pièces de mourir loin.
Héritage est l'endroit où vous venez de prendre quelque chose qui existe déjà et l'utiliser. Il n'y a pas de relation forte. Une personne pourrait hériter de ses pères de l'immobilier, mais il peut le faire sans elle.
Je ne sais pas Java donc je ne peux pas vous donner un exemple, mais je peux fournir une explication des concepts.
Héritage entre deux classes, où une classe étend une autre classe établit "EST UN" de la relation.
Composition sur l'autre extrémité contient une instance d'une autre classe dans votre classe établit "A Un" de la relation. Composition en java, est utile car il est techniquement facilite l'héritage multiple.
Bien à la fois l'Héritage et la Composition fournit un code reusablility, principale différence entre la Composition et l'Héritage en Java, c'est que la Composition permet la réutilisation de code sans l'extension, mais pour l'Héritage, vous devez étendre la classe pour toute réutilisation de code ou de fonctionnalité. Une autre différence qui provient de ce fait est que, en utilisant la Composition, vous pouvez réutiliser le code pour la même classe finale qui n'est pas extensible, mais l'Héritage ne peut pas réutiliser le code dans de tels cas. Également par l'aide de la Composition, vous pouvez réutiliser le code à partir de plusieurs classes, selon qu'elles sont déclarées comme un membre de la variable, mais avec l'Héritage que vous pouvez réutiliser le code ne représentent qu'une classe en Java, vous ne pouvez étendre une classe, parce que l'Héritage multiple n'est pas prise en charge par Java. Vous pouvez le faire en C++, mais parce que il y a une classe ne peut étendre plus d'une classe. BTW, Vous devriez toujours préférez la Composition au cours de l'Héritage en Java, ce n'est pas juste moi, mais même Joshua Bloch a suggéré, dans son livre
Je pense que cet exemple explique clairement les différences entre héritage et composition.
Dans cet exemple, le problème est résolu en utilisant l'héritage et la composition. L'auteur accorde une attention au fait que, dans héritage, un changement dans la super-classe peut causer des problèmes dans une classe dérivée, qui en hériter.
Là aussi vous pouvez voir la différence dans la représentation lorsque vous utilisez un UML pour l'héritage ou la composition.
http://www.javaworld.com/article/2076814/core-java/inheritance-versus-composition--which-one-should-you-choose-.html
Héritages Vs Composition.
Héritage et composition les deux sont utilisés pour la réutilisation et l'extension de comportement de la classe.
Héritages principalement utiliser dans une famille d'algorithme modèle de programmation telles que " EST-UN type de relation similaire type d'objet. Exemple.
Ce sont appartient à la famille de Voitures.
Composition représente A-UN Type de relation.Il montre la capacité d'un objet comme Duster a Cinq Vitesses , Safari a quatre Engrenages etc. Chaque fois que nous avons besoin d'étendre la capacité d'une classe existante, puis utiliser la composition.Exemple nous avons besoin d'ajouter un plus de matériel dans Duster objets alors nous devons créer un plus de matériel, d'objets et de composer pour le duster objet.
Nous ne devrions pas faire les modifications dans la classe de base jusqu'à ce que toutes les classes dérivées besoin de ces fonctionnalités.Pour ce scénario, nous devrions utiliser la Composition.Comme
classe Dérivée de la Classe B
Classe Dérivée de la Classe C
Classe Dérivée de la Classe D.
Lorsque nous avons ajouter toutes les fonctionnalités de la classe A, alors il est disponible pour toutes les sous-classes, même lorsque la Classe C et D ne sont pas nécessaires, ces fonctionnalités.Pour ce scénario, nous avons besoin de créer une catégorie distincte pour ceux de la fonctionnalité et de composer pour la classe(ici est la classe B).
Ci-dessous en est l'exemple:
Composition des moyens de création d'un objet à une classe qui a la relation avec la classe particulière.
Supposons que l'Étudiant a la relation avec les Comptes;
Un Héritage est, c'est la classe précédente avec la fonction étendue. Que signifie cette nouvelle classe est la classe Ancienne avec quelques fonctionnalités étendues.
Supposons que l'Étudiant est un Étudiant, mais à Tous les Élèves de l'Homme. Donc, il y a une relation avec l'étudiant et de l'homme. C'est l'Héritage.
Non , les Deux sont différents . Composition suivre "A-UN" de la relation et de l'héritage suivre "EST-UN" de la relation . Le meilleur Exemple pour la composition a été Stratégique motif .
L'héritage signifie la réutilisation de l'ensemble des fonctionnalités d'une classe, d'Ici ma classe ont pour utiliser toutes les méthodes de la super-classe et les élèves de ma classe sera titely couplé avec la super-classe et le code seront dupliquées dans les deux classes dans le cas de l'héritage.
Mais nous pouvons surmonter tous ces problèmes lorsque nous utilisons la composition de parler avec une autre classe . la composition est de déclarer un attribut d'une autre classe dans ma classe à qui nous voulons parler. et les fonctionnalités que nous voulons à partir de cette classe, nous pouvons obtenir l'aide de cet attribut.