Em Java, os dois estão intimamente relacionados. Isso ocorre porque o Java usa uma técnica para chamada de método chamada "despacho dinâmico". Se eu tiver
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
Então vemos que B herda spin
de A. No entanto, quando tentamos manipular o objeto como se fosse um tipo A, ainda temos o comportamento de B para draw
. O draw
comportamento é polimórfico.
Em algumas línguas, polimorfismo e herança não são tão intimamente relacionados. No C ++, por exemplo, funções não declaradas virtuais são herdadas, mas não serão despachadas dinamicamente, portanto você não terá esse comportamento polimórfico, mesmo quando usar a herança.
Em javascript, todas as chamadas de funções são despachadas dinamicamente e você tem digitação fraca. Isso significa que você pode ter um monte de objetos não relacionados, cada um com o seu draw
, ter uma função iterar sobre eles e chamar a função, e cada um se comportaria bem. Você teria seu próprio desenho polimórfico sem precisar de herança.