Tôi luôn thích ý tưởng có nhiều sự kế thừa được hỗ trợ trong một ngôn ngữ. Thông thường, mặc dù nó cố tình tha thứ và "sự thay thế" được cho là giao diện. Các giao diện đơn giản là không bao gồm tất cả các kế thừa nhiều mặt đất, và hạn chế này đôi khi có thể dẫn đến nhiều mã soạn sẵn hơn.
Lý do cơ bản duy nhất tôi từng nghe cho điều này là vấn đề kim cương với các lớp cơ sở. Tôi không thể chấp nhận điều đó. Đối với tôi, nó phát ra rất nhiều điều tồi tệ như, "Chà, có thể làm hỏng nó lên, vì vậy nó tự động là một ý tưởng tồi." Bạn có thể làm hỏng bất cứ điều gì trong một ngôn ngữ lập trình, và tôi có nghĩa là bất cứ điều gì. Tôi chỉ không thể thực hiện điều này một cách nghiêm túc, ít nhất là không có lời giải thích kỹ lưỡng hơn.
Chỉ cần nhận thức được vấn đề này là 90% trận chiến. Hơn nữa, tôi nghĩ rằng tôi đã nghe một cái gì đó nhiều năm trước về một công việc có mục đích chung liên quan đến thuật toán "phong bì" hoặc một cái gì đó tương tự (điều này có rung chuông không, bất cứ ai?).
Liên quan đến vấn đề kim cương, vấn đề có khả năng thực sự duy nhất tôi có thể nghĩ đến là nếu bạn đang cố gắng sử dụng thư viện của bên thứ ba và không thể thấy rằng hai lớp dường như không liên quan trong thư viện đó có một lớp cơ sở chung, nhưng ngoài tài liệu, một tính năng ngôn ngữ đơn giản có thể, giả sử, yêu cầu bạn tuyên bố cụ thể ý định tạo ra một viên kim cương trước khi nó thực sự biên dịch một viên kim cương cho bạn. Với tính năng như vậy, bất kỳ việc tạo ra một viên kim cương đều là cố ý, liều lĩnh hoặc bởi vì người ta không biết về cạm bẫy này.
Vì vậy, tất cả những gì được nói ... Có bất kỳ lý do thực sự nào mà hầu hết mọi người ghét nhiều di sản, hoặc tất cả chỉ là một loạt các hiềm khích gây ra nhiều tác hại hơn là tốt? Có một cái gì đó mà tôi không nhìn thấy ở đây? Cảm ơn bạn.
Thí dụ
Xe kéo dài WheeledVehicle, KIASpectra kéo dài Xe và Điện tử, KIASpectra chứa Radio. Tại sao KIASpectra không chứa Điện tử?
Bởi vì nó là một điện tử. Kế thừa so với thành phần phải luôn luôn là mối quan hệ is-a và mối quan hệ có-có.
Bởi vì nó là một điện tử. Có dây, bảng mạch, công tắc, vv tất cả lên và xuống điều đó.
Bởi vì nó là một điện tử. Nếu pin của bạn hết vào mùa đông, bạn sẽ gặp nhiều rắc rối như thể tất cả các bánh xe của bạn đột nhiên bị mất.
Tại sao không sử dụng giao diện? Lấy số 3 chẳng hạn. Tôi không muốn viết đi viết lại nhiều lần và tôi thực sự không muốn tạo ra một lớp người trợ giúp proxy kỳ quái để làm điều này:
private void runOrDont()
{
if (this.battery)
{
if (this.battery.working && this.switchedOn)
{
this.run();
return;
}
}
this.dontRun();
}
(Chúng tôi không quan tâm đến việc triển khai đó là tốt hay xấu.) Bạn có thể tưởng tượng làm thế nào có thể có một số chức năng này được liên kết với Điện tử không liên quan đến bất cứ điều gì trong WheeledVehicle và ngược lại.
Tôi không chắc có nên giải quyết ví dụ đó hay không, vì có chỗ để giải thích ở đó. Bạn cũng có thể nghĩ về mặt mở rộng Máy bay và FlyingObject và Bird kéo dài Animal và FlyingObject, hoặc về một ví dụ thuần túy hơn nhiều.
Traits
- chúng hoạt động như các giao diện với việc triển khai tùy chọn, nhưng có một số hạn chế giúp ngăn ngừa các vấn đề như vấn đề kim cương phát sinh.
KiaSpectra
không phải là một Electronic
; nó có Điện tử, và có thể là một ElectronicCar
(sẽ kéo dài Car
...)