En Java, les deux sont étroitement liés. Cela est dû au fait que Java utilise une technique d'invocation de méthode appelée «répartition 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
Ensuite, nous voyons que B hérite 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 draw
comportement est polymorphe.
Dans certaines langues, le polymorphisme et l'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 seront pas distribuées dynamiquement, donc vous n'obtiendrez pas ce comportement polymorphe même lorsque vous utilisez l'héritage.
En javascript, chaque appel de fonction est distribué dynamiquement et vous avez un typage faible. Cela signifie que vous pourriez avoir un tas d'objets non liés, chacun avec le leur draw
, avoir une fonction itérer sur eux et appeler la fonction, et chacun se comporterait très bien. Vous auriez votre propre tirage polymorphe sans avoir besoin d'héritage.