web-dev-qa-db-fra.com

Quelle est la principale différence entre l'héritage et le polymorphisme?

Aujourd'hui, on m'a présenté cette question lors d'un examen de fin de module à livre ouvert et je me suis retrouvé perdu. Je lisais Head first Javaet les deux définitions semblaient être exactement les mêmes. Je me demandais simplement quelle était la différence PRINCIPALE dans mon esprit. Je sais qu'il existe un certain nombre de questions similaires à ce sujet, mais aucune de celles que j'ai vues ne fournit une réponse définitive.

139
Darren Burgess

L'héritage se produit lorsqu'une «classe» dérive d'une «classe» existante. Donc, si vous avez une classe Person, vous avez une classe Student qui étend Person, Student inherits toutes les choses que Person a. Il y a quelques détails sur les modificateurs d'accès que vous avez mis sur les champs/méthodes dans Person, mais c'est l'idée de base. Par exemple, si vous avez un champ privé sur Person, Student ne le verra pas car ses champs privés et privés ne sont pas visibles pour les sous-classes.

Le polymorphisme traite de la façon dont le programme décide quelles méthodes il doit utiliser, en fonction du type d’objet qu’il possède. Si vous avez une Person, qui a une méthode read, et que vous avez une Student qui étend Person, qui a sa propre implémentation de read, la méthode appelée est déterminée pour vous par l'exécution, selon que vous ayez une Person ou une Student . Cela devient un peu délicat, mais si vous faites quelque chose comme

Person p = new Student();
p.read();

la méthode de lecture sur Student est appelée. C'est le polymorphisme en action. Vous pouvez effectuer cette affectation car Student est un Person, mais le moteur d’exécution est suffisamment intelligent pour savoir que le type réel de p est Student .

Notez que les détails diffèrent selon les langues. Vous pouvez faire l'héritage en javascript par exemple, mais c'est complètement différent de la façon dont il fonctionne en Java.

250
hvgotcodes

Héritage fait référence à en utilisant la structure et le comportement d'une super classe dans une sous-classe. 

Polymorphisme se réfère à changer le comportement d'une super classe de la sous-classe.

170
Ted Hopp

Polymorphisme : La possibilité de traiter des objets de types différents de manière similaire. Exemple: la girafe et le crocodile sont tous deux des animaux, et les animaux peuvent Move. Si vous avez une instance de Animal, vous pouvez appeler Move sans savoir ni se soucier de quel type d'animal il s'agit.

Héritage : Il s'agit d'un moyen de réaliser à la fois le polymorphisme et la réutilisation de code.

Autres formes de polymorphisme : Il existe un autre moyen de réaliser le polymorphisme, tel que les interfaces, qui fournissent uniquement du polymorphisme mais pas de réutilisation du code (parfois, le code est très différent, tel que Move pour un serpent serait très différent de Move pour un chien, auquel cas une interface constituerait le meilleur choix polymorphe dans ce cas.

Dans d'autres langages dynamiques, Duck Typing permet d'obtenir un polymorphisme, les classes n'ayant même pas besoin de partager la même classe de base ou interface, elles ont simplement besoin d'une méthode portant le même nom. Ou encore, plus dynamique que le Javascript, vous n’avez même pas besoin de classes, mais un objet portant le même nom de méthode peut être utilisé de manière polymorphe.

58
Davy8

La principale différence est que le polymorphisme est un résultat spécifique de l'héritage. Le polymorphisme est l'endroit où la méthode à appeler est déterminée au moment de l'exécution en fonction du type de l'objet. Il s'agit d'une situation résultant du fait qu'une classe hérite d'une autre et substitue une méthode particulière. Toutefois, dans une arborescence d'héritage normale, vous n'avez pas à remplacer de méthode et, par conséquent, tous les appels de méthode ne doivent pas nécessairement être polymorphes. Cela a-t-il du sens? C'est un problème similaire à tous les véhicules Ford sont des automobiles, mais toutes les voitures ne sont pas Fords (bien que pas tout à fait ....).

De plus, le polymorphisme traite de l'invocation de méthode, tandis que l'héritage décrit également les membres de données, etc.

17
Chris Thompson

En Java, les deux sont étroitement liés. En effet, Java utilise une technique d’appel de méthode appelée "dispatch dynamique". Si j'ai

public class A {
  public void draw() { ... }
  public void spin() { ... }
}

public class B extends A {
  public void draw() { ... }
  public void bad() { ... }
}

...

A testObject = new B();

testObject.draw(); // calls B's draw, polymorphic
testObject.spin(); // calls A's spin, inherited by B
testObject.bad(); // compiler error, you are manipulating this as an A

Nous voyons ensuite que B hérite de spin de A. Cependant, lorsque nous essayons de manipuler l'objet comme s'il s'agissait d'un type A, nous obtenons toujours le comportement de B pour draw. Le comportement draw est polymorphe.

Dans certaines langues, polymorphisme et héritage ne sont pas aussi étroitement liés. En C++, par exemple, les fonctions non déclarées virtuelles sont héritées, mais ne sont pas distribuées de manière dynamique. Par conséquent, vous n'obtiendrez pas ce comportement polymorphe, même lorsque vous utilisez l'héritage. 

En javascript, chaque appel de fonction est distribué de manière dynamique et le typage est faible. Cela signifie que vous pouvez avoir un groupe d'objets sans rapport, chacun avec sa propre variable draw, une fonction qui les itérera et l'appelle, et chacun se comportera parfaitement. Vous auriez votre propre tirage polymorphe sans avoir besoin d'héritage.

12
ccoakley

Polymorphisme: Supposons que vous travailliez pour une entreprise qui vend des stylos. Vous créez donc une classe très agréable appelée "Stylo" qui traite de tout ce que vous devez savoir sur un stylo. Vous écrivez toutes sortes de classes pour la facturation, l'expédition, la création de factures, le tout en utilisant la classe Plume. Un patron d'un jour vient et dit: "Excellente nouvelle! La société grandit et nous vendons maintenant des livres et des CD!" Ce n'est pas une bonne nouvelle, car vous devez maintenant changer chaque classe qui utilise Pen pour utiliser également Book & CD. Mais que se passe-t-il si vous aviez initialement créé une interface appelée "SellableProduct" et que Pen l’implémentait? Ensuite, vous auriez pu écrire toutes vos classes d'expédition, de facturation, etc. pour utiliser cette interface au lieu de Pen. Il ne vous reste plus qu'à créer une nouvelle classe appelée Book & CompactDisc qui implémentera l'interface SellableProduct. En raison du polymorphisme, toutes les autres classes pourraient continuer à fonctionner sans changement! Faire sens?

Donc, cela signifie utiliser l'héritage, qui est l'un des moyens d'atteindre le polymorphisme.

Le polymorhisme peut être possible dans une classe/interface mais l'héritage toujours entre 2 OR plus de classes/interfaces. L'héritage est toujours conforme à la relation "est-a" alors qu'il ne correspond pas toujours au polymorphisme (qui peut être conforme à la fois à la relation "est-a"/"a-a".

12
AmitK

L'héritage est davantage une chose statique (une classe en étend une autre), tandis que le polymorphisme est une chose dynamique/à l'exécution (un objet se comporte en fonction de son type dynamique/d'exécution et non de son type statique/déclaration).

Par exemple.

// This assignment is possible because B extends A
A a = new B();
// polymorphic call/ access
a.foo();

-> Bien que le type statique/déclaration de a soit A, le type réel de dynamique/exécution est B et donc a.foo () sera exécuté comme indiqué par B dans B et non par A.

6
Puce

La documentation Oracle cite la différence avec précision. 

héritage: Une classe hérite de champs et méthodes de toutes ses super-classes, qu'elles soient directes ou indirectes. Une sous-classe peut remplacer les méthodes dont elle hérite ou masquer des champs ou des méthodes dont elle hérite}. (Notez que masquer des champs est généralement une mauvaise pratique de programmation.)

polymorphisme:polymorphisme fait référence à un principe de biologie dans lequel un organisme ou une espèce peut avoir de nombreuses formes ou étapes. Ce principe peut également être appliqué à la programmation orientée objet et aux langages tels que le langage Java. Les sous-classes d'une classe peuvent définir leurs propres comportements tout en partageant les mêmes fonctionnalités que la classe parente.

polymorphisme n'est pas applicable pour les champs. 

Article similaire:

Polymorphisme vs dérogation vs surcharge

3
Ravindra babu

Le polymorphisme est une approche pour exprimer un comportement commun entre types d'objets ayant des traits similaires. Cela permet également de créer des variations de ces traits par priorité. L'héritage est un moyen de réaliser un polymorphisme à travers une hiérarchie d'objets où les objets expriment des relations et des comportements abstraits. Ce n'est pas le seul moyen d'obtenir un polymorphisme. Le prototype est une autre façon d'exprimer un polymorphisme différent de l'héritage. JavaScript est un exemple de langage utilisant un prototype. J'imagine qu'il y a aussi d'autres moyens.

3
laz

L'héritage est un concept lié à la réutilisation du code. Par exemple, si j'ai une classe parent, dites Animal et qu'elle contient certains attributs et méthodes (pour cet exemple, dites makeNoise() et sleep()) et que je crée deux classes enfants appelées Dog et Cat. Étant donné que les chiens et les chats vont dormir de la même manière (je suppose), il n’est pas nécessaire d’ajouter plus de fonctionnalités à la méthode sleep() dans les sous-classes Dog et Cat fournies par la classe parente Animal. Cependant, une Dog aboie et une Cat miaule donc bien que la classe Animal puisse avoir une méthode pour faire du bruit, un chien et un chat font des bruits différents les uns par rapport aux autres. Il est donc nécessaire de redéfinir ce comportement pour leurs types spécifiques. Ainsi la définition du polymorphisme. J'espère que cela t'aides.

3
avenger12

Le polymorphisme est un effet de héritage . Cela ne peut se produire que dans des classes qui se prolongent. Il vous permet d'appeler des méthodes d'une classe sans connaître le type exact de la classe. En outre, le polymorphisme se produit à run time .

Par exemple, exemple de polymorphisme Java:

 enter image description here 

L'héritage permet aux classes dérivées de partager les interfaces et le code de leurs classes de base. Cela se produit à le temps de compilation .

Par exemple, toutes les classes de la plate-forme Java sont des descendants d’objet (image fournie par Oracle):

 enter image description here 

Pour en savoir plus sur Héritage Java et Polymorphisme Java

1
Stas

l'héritage est une sorte de polymorphisme, précisément l'héritage est le polymorphisme dynamique. Ainsi, lorsque vous supprimez l'héritage, vous ne pouvez plus remplacer.

Le but principal de polymorphism: créer une variable de référence pour super class en maintenant l'objet subclass => un objet peut exécuter plusieurs comportements

Dans inheritance, subclass hérite des propriétés de super class.

0
satya

L'héritage survient lorsque la classe A hérite de toutes ses méthodes mères/méthodes protégées/publiques non statiques jusqu'à l'objet.

0
Cosmin Cosmin

Le polymorphisme est obtenu par Héritage in Java.

public class Animal {}
public interface Herbivore {}
public interface Carnivore {}
public interface Pet {}

public class Hamster extends Animal implements Herbivore implements Pet () {}
public class Cat extends Animal implements Carnivore implements Pet () {}

Hamster class hérite destructurede Animal, Herbivore et Pet pour exhiberBéhaviorisme polymorphed'un animal domestique.

Cat class hérite destructurede Animal, Carnivore et Pet afin d'exposer égalementle behaviorisme polymorphed'un animal domestique.

0
nabster

Si vous utilisez Java, c'est aussi simple que cela:

Le polymorphisme utilise des méthodes héritées mais les "redéfinit" pour faire quelque chose de différent (ou la même chose si vous appelez super alors techniquement ne serait pas polymorphe).

Corrige moi si je me trompe.

0
Oliver Dixon