Trong Java, các khái niệm về đa hình và thừa kế được "hàn lại với nhau"; nói chung, nó không phải là cách mà:
- Polymorphism cho phép bạn gọi các phương thức của một lớp mà không biết chính xác loại lớp
- thừa kế cho phép có nguồn gốc lớp học phần giao diện và mã của các lớp cơ sở của họ
có những ngôn ngữ nơi thừa kế được tách rời từ polymorphism:
- Trong C++ bạn có thể kế thừa một lớp học mà không tạo ra hành vi đa hình (tức là không các hàm đánh dấu trong lớp cơ sở với
virtual
)
- Trong mục tiêu C bạn có thể thực hiện một phương thức trên một lớp không liên quan và gọi nó từ một nơi chỉ biết chữ ký của phương thức.
Quay lại Java, lý do sử dụng đa hình là tách mã của bạn khỏi chi tiết về việc thực hiện các đối tác của nó: ví dụ: nếu bạn có thể viết phương pháp Feed(Animal animal)
hoạt động cho tất cả các loại động vật, phương pháp này sẽ vẫn áp dụng được khi bạn thêm các lớp con hoặc triển khai khác của Animal
.Điều này trái ngược với phương pháp Feed(Dog dog)
, sẽ được kết hợp chặt chẽ với chó.
Theo như tuyên bố
Dog d = new Dog();
đi, không có lý do chung để tránh điều này nếu bạn biết rằng phần còn lại của giao dịch phương pháp của bạn đặc biệt với những con chó. Tuy nhiên, trong nhiều trường hợp, sau đó không phải là trường hợp: ví dụ, lớp học của bạn hoặc các phương pháp của bạn sẽ thường không nhạy cảm với việc thực hiện chính xác, ví dụ
List<Integer> numbers = new ArrayList<Integer>();
Trong những trường hợp như vậy, bạn có thể thay new ArrayList<Integer>()
với new LinkedList<Integer>()
, và biết rằng mã của bạn sẽ biên dịch. Ngược lại, có danh sách numbers
của bạn được khai báo là ArrayList<Integer> numbers
, việc chuyển đổi như vậy có thể không chắc chắn.
Điều này được gọi là "lập trình cho giao diện". Có rất tốt answer trên Stack Overflow giải thích nó.
Tiêu đề của câu hỏi ("Đa hình so với thừa kế") sai theo định nghĩa :) – Poni
có thể trùng lặp của [Sự khác nhau chính giữa Thừa kế và đa hình là gì?] (Http://stackoverflow.com/questions/6308178/what- là sự khác biệt chính-giữa-thừa kế và đa hình) – tstew