Trong Java, hai cái này có liên quan chặt chẽ với nhau. Điều này là do Java sử dụng một kỹ thuật để gọi phương thức gọi là "công văn động". Nếu tôi có
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
Sau đó, chúng ta thấy rằng kế thừa B spin
từ A. Tuy nhiên, khi chúng tôi cố gắng để thao tác các đối tượng như thể nó là một loại A, chúng tôi vẫn nhận được hành vi của B cho draw
. Cácdraw
hành vi là đa hình.
Trong một số ngôn ngữ, tính đa hình và tính kế thừa không liên quan chặt chẽ với nhau. Ví dụ, trong C ++, các hàm không được khai báo ảo được kế thừa, nhưng sẽ không được gửi đi một cách linh hoạt, do đó bạn sẽ không có hành vi đa hình đó ngay cả khi bạn sử dụng tính kế thừa.
Trong javascript, mọi lệnh gọi hàm được gửi tự động và bạn có kiểu gõ yếu. Điều này có nghĩa là bạn có thể có một loạt các đối tượng không liên quan, mỗi đối tượng của riêng chúng draw
, có một chức năng lặp lại chúng và gọi hàm đó, và mỗi đối tượng sẽ hoạt động tốt. Bạn sẽ có bản vẽ đa hình của riêng mình mà không cần kế thừa.