Càng tìm hiểu về các mô hình lập trình khác nhau, chẳng hạn như lập trình chức năng, tôi càng bắt đầu đặt câu hỏi về sự khôn ngoan của các khái niệm OOP như kế thừa và đa hình. Lần đầu tiên tôi học về sự kế thừa và đa hình ở trường, và tại thời điểm đa hình có vẻ như là một cách tuyệt vời để viết mã chung cho phép dễ dàng mở rộng.
Nhưng khi đối mặt với việc gõ vịt (cả động và tĩnh) và các tính năng chức năng như các hàm bậc cao hơn, tôi đã bắt đầu xem tính kế thừa và đa hình là áp đặt một hạn chế không cần thiết dựa trên tập hợp các mối quan hệ mỏng manh giữa các đối tượng. Ý tưởng chung đằng sau tính đa hình là bạn viết một hàm một lần và sau đó bạn có thể thêm chức năng mới vào chương trình của mình mà không thay đổi hàm ban đầu - tất cả những gì bạn cần làm là tạo một lớp dẫn xuất khác thực hiện các phương thức cần thiết.
Nhưng điều này đơn giản hơn rất nhiều để đạt được thông qua việc gõ vịt, cho dù đó là ngôn ngữ động như Python hay ngôn ngữ tĩnh như C ++.
Ví dụ, hãy xem xét hàm Python sau, theo sau là tương đương C ++ tĩnh của nó:
def foo(obj):
obj.doSomething()
template <class Obj>
void foo(Obj& obj)
{
obj.doSomething();
}
Tương đương OOP sẽ giống như mã Java sau:
public void foo(DoSomethingable obj)
{
obj.doSomething();
}
Tất nhiên, sự khác biệt chính là phiên bản Java yêu cầu tạo giao diện hoặc phân cấp thừa kế trước khi nó hoạt động. Do đó, phiên bản Java liên quan đến nhiều công việc hơn và kém linh hoạt hơn. Ngoài ra, tôi thấy rằng hầu hết các hệ thống phân cấp thừa kế trong thế giới thực có phần không ổn định. Tất cả chúng ta đều đã thấy các ví dụ về Hình dạng và Động vật, nhưng trong thế giới thực, khi các yêu cầu kinh doanh thay đổi và các tính năng mới được thêm vào, thật khó để thực hiện bất kỳ công việc nào trước khi bạn cần thực sự kéo dài mối quan hệ "là" các lớp con, hoặc cách khác sửa sang lại / cấu trúc lại cấu trúc phân cấp của bạn để bao gồm các lớp cơ sở hoặc giao diện tiếp theo để đáp ứng các yêu cầu mới. Với cách gõ vịt, bạn không cần phải lo lắng về việc mô hình hóa bất cứ điều gì - bạn chỉ cần lo lắng về chức năng bạn cần.
Tuy nhiên, tính kế thừa và tính đa hình rất phổ biến đến nỗi tôi nghi ngờ sẽ không có gì quá đáng khi gọi chúng là chiến lược chi phối cho khả năng mở rộng và tái sử dụng mã. Vậy tại sao sự kế thừa và đa hình lại thành công rực rỡ như vậy? Tôi có đang xem xét một số lợi thế nghiêm trọng mà tính kế thừa / đa hình có được khi gõ vịt không?
obj
không códoSomething
phương pháp? Là một ngoại lệ được nêu ra? Không có gì xảy ra?