2008-12-13 9 views
9

thể trùng lặp:
What is the exact problem with multiple inheritance?Có nhiều Inheritance Evil?

Tại sao đa kế thừa coi là ác đồng thời thực hiện nhiều giao diện không? Đặc biệt là khi một lần xem xét rằng giao diện chỉ đơn thuần là các lớp trừu tượng thuần túy?

(Nhiều hay ít hơn) bản sao củaWhat is the exact problem with multiple inheritance?, Multiple Inheritance in C#, và một số người khác ...

Trả lời

27

Vấn đề phổ biến với đa thừa kế là "vấn đề kim cương".

A 
/\ 
B c 
\/
    D 

Nếu phương pháp ảo trong A được triển khai bởi cả B và C, bạn sẽ nhận được phương thức nào khi tạo D?

Lý do không phải là vấn đề với giao diện vì giao diện không có triển khai, vì vậy nếu A/B/C là tất cả giao diện, thì D chọn cách triển khai phương pháp A theo bất kỳ cách nào là thích hợp.

+2

Nó không phải là một vấn đề nếu bạn yêu cầu D để ambiguate. –

2

Làm thế nào để bạn hòa giải nếu A thực hiện một phương pháp gọi là z và b thực hiện một phương pháp gọi là z và bạn có:

con: a, b

ngay bây giờ nếu mã khách hàng của tôi gọi con mới(). Z(). Triển khai nào đang được gọi? Tôi không nghĩ rằng nó quá nhiều như vậy mà nó ác nó chỉ làm tăng rất nhiều điểm dính và cung cấp ít giá trị

+0

Vấn đề này có thể dễ dàng được giải quyết nếu trình biên dịch yêu cầu bạn ghi đè phương thức z trong lớp con. Ngoài ra, cùng một vấn đề phát sinh trong các ngôn ngữ mà nhiều giao diện thừa kế được cho phép nếu bạn có 2 giao diện với một phương thức có cùng tên nhưng chữ ký khác nhau. – hariseldon78

3

MI không quá tệ như một giải pháp rất phức tạp cho một vấn đề hiếm gặp. Trong hầu hết các trường hợp, có một cách tốt hơn để thực hiện điều tương tự.

13

Nó được coi là xấu bởi vì nó phức tạp hơn và tăng nhiều vấn đề hơn mọi người thường mong đợi, đặc biệt là khi các lớp cơ sở không hoàn toàn trừu tượng (không có thành viên dữ liệu). Kim cương kế thừa có thể được giải quyết bằng cách sử dụng thừa kế ảo, nơi một cơ sở chung được chia sẻ. Và các trình biên dịch có thể bắt gặp các va chạm chữ ký của phương thức. Được sử dụng tốt, nó có thể tạo ra các giải pháp thanh lịch và DRY, nếu không có nhiều chi tiết hơn để thực hiện thông qua giao diện và sáng tác/đại biểu.

Một thành ngữ MI phổ biến trong C++ là dành cho các hàm dựng phức tạp, trong đó các đối tượng cơ sở cần được xây dựng với các đối tượng thành viên không tầm thường và vì các đối tượng cơ sở cần được xây dựng trước đối tượng thành viên, mẹo sử dụng MI (" dựa trên thành ngữ "thành ngữ"), nếu không bạn phải sử dụng một nhà máy và nhiều bước để thực hiện việc xây dựng như Java (Java không có MI cho các lớp không giao diện).

Đừng sợ nó và sử dụng nó khi thích hợp (mặc dù nó có thể mất một số thực hành để phát hiện một sự phù hợp tốt).