En Java, los dos están estrechamente relacionados. Esto se debe a que Java utiliza una técnica para invocar métodos llamada "despacho dinámico". Si tengo
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
Entonces vemos que hereda B spin
de A. Sin embargo, cuando tratamos de manipular el objeto como si se tratara de un tipo A, todavía nos llegan comportamiento de B para draw
. El draw
comportamiento es polimórfico.
En algunos idiomas, el polimorfismo y la herencia no están tan estrechamente relacionados. En C ++, por ejemplo, las funciones no declaradas virtuales se heredan, pero no se enviarán dinámicamente, por lo que no obtendrá ese comportamiento polimórfico incluso cuando use la herencia.
En javascript, todas las llamadas a funciones se envían dinámicamente y tiene una escritura débil. Esto significa que podría tener un montón de objetos no relacionados, cada uno con los suyos draw
, tener una función iterar sobre ellos y llamar a la función, y cada uno se comportaría bien. Tendría su propio dibujo polimórfico sin necesidad de herencia.