In Java, i due sono strettamente correlati. Questo perché Java utilizza una tecnica per l'invocazione del metodo chiamata "invio dinamico". Se ho
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
Poi vediamo che eredita B spin
da A. Tuttavia, quando cerchiamo di manipolare l'oggetto come se fosse di tipo A, ancora otteniamo il comportamento di B per draw
. Il draw
comportamento è polimorfico.
In alcune lingue, il polimorfismo e l'eredità non sono così strettamente correlati. In C ++, ad esempio, le funzioni non dichiarate virtuali vengono ereditate, ma non verranno inviate in modo dinamico, quindi non si otterrà quel comportamento polimorfico anche quando si utilizza l'ereditarietà.
In JavaScript, ogni chiamata di funzione viene inviata in modo dinamico e si ha una digitazione debole. Ciò significa che potresti avere un mucchio di oggetti non correlati, ognuno con il proprio draw
, avere una funzione che scorre su di essi e chiamerebbe la funzione, e ognuno si comporterebbe perfettamente. Avresti il tuo disegno polimorfico senza bisogno di eredità.