Có một quy tắc chung về thiết kế OO mà bạn nên mô hình là một mối quan hệ sử dụng thừa kế và có mối quan hệ bằng cách sử dụng ngăn chặn/tập hợp và chuyển tiếp/ủy quyền. Điều này càng bị thu hẹp bởi lời khuyên từ GoF rằng bạn thường nên ngăn chặn sự thừa kế, có lẽ, nếu bạn có thể tạo ra một trường hợp mạnh mẽ cho một trong một tình huống cụ thể, vấn đề thừa kế đôi khi có thể gây ra.DRY so với "thích ngăn chặn hơn thừa kế"
Tôi hiểu lý do đằng sau suy nghĩ này và tôi không nhất thiết không đồng ý với điều đó. Tuy nhiên, khi tôi thấy một lớp với số điểm của các phương thức, mỗi phương thức chỉ chuyển tiếp đến một số biến mẫu, tôi thấy một dạng sao chép mã. Mã trùng lặp, theo ý kiến của tôi, mùi mã cuối cùng. Reimplementing một giao thức rất lớn của phương pháp chỉ vì mối quan hệ giữa hai lớp học là không đúng là-một có vẻ như quá mức cần thiết. Đó là mã bổ sung, không cần thiết được thêm vào hệ thống, mã mà bây giờ cần được kiểm tra và ghi lại giống như bất kỳ phần nào khác của hệ thống - mã mà bạn có thể sẽ không phải viết nếu bạn vừa kế thừa.
Chi phí tôn trọng hiệu trưởng thừa kế có bao giờ vượt quá lợi ích của nó không?
Bạn có thể đưa ra ví dụ cụ thể hơn không? Đó là một chút quá trừu tượng để bình luận mà không giả định những gì bạn có ý nghĩa.Ví dụ: –
Ví dụ, bạn muốn hành vi giống như HashTable trong một lớp, nhưng lớp không đủ nghiêm ngặt giống như một HashTable để biện minh cho kế thừa từ nó theo quy tắc là-a. Nhưng có nó chứa một HashTable sẽ dẫn đến reimplementing một phần lớn HashTable của phương pháp, hầu hết trong số đó sẽ chỉ gọi phương pháp tương tự trên biến dụ có chứa HashTable. –
Việc tôi thực hiện các vấn đề thừa kế là có các tác dụng phụ không mong muốn bằng cách kế thừa từ các lớp học. Bằng cách kế thừa, các phụ thuộc được tạo ra và điều đó sẽ ảnh hưởng đến khả năng bảo trì tổng thể của hệ thống. Điều này rõ ràng không phải là một vấn đề lớn nếu hệ thống phân cấp thừa kế là nông, nhưng nếu nó thực sự sâu, nó có thể gây ra vấn đề. – Min