2012-02-20 39 views
10

Tôi đang cố gắng tìm một ví dụ tốt cho việc sử dụng đa thừa kế những gì không thể được thực hiện với giao diện bình thường.Nhiều thừa kế: Ví dụ điển hình là gì?

Tôi nghĩ rằng thật khó để tìm một ví dụ như vậy mà không thể được mô hình theo một cách khác.

Chỉnh sửa: Ý tôi là, ai đó có thể đặt tên cho tôi là ví dụ thực tế tốt khi bạn CẦN sử dụng nhiều thừa kế để triển khai ví dụ này càng rõ ràng càng tốt. Và nó không nên sử dụng nhiều giao diện, chỉ là cách bạn có thể kế thừa nhiều lớp trong C++.

+1

Bạn đã chấp nhận [Câu trả lời của Luchian Grigore] (http://stackoverflow.com/a/9360014/2932052), nhưng bạn có thực sự hài lòng không? Tôi nghĩ rằng đây là một câu hỏi rất hay (+1), nhưng có lẽ không phải cho SO, bởi vì nó có thể không có một câu trả lời thực sự có thể thuyết phục các lập trình viên quan trọng. – Wolf

+1

Tôi không hài lòng lắm. Tôi đã phải tranh luận với một lập trình viên quan trọng trong ngày và anh ta không thích tranh cãi. Tôi đã chỉ đơn giản là đưa ra nó thành thật: D –

+0

Sau đó, nó có thể tốt hơn để không chấp nhận "câu trả lời" đó là không có gì nhiều hơn một trích dẫn trang trí thưa thớt của một ví dụ Wikipedia (nghèo). Có lẽ sẽ có ai đó có câu trả lời thực sự trong tương lai - không, có lẽ không phải tôi :-) – Wolf

Trả lời

7

Sau đây là một cổ điển:

class Animal { 
public: 
    virtual void eat(); 
}; 

class Mammal : public Animal { 
public: 
    virtual void breathe(); 
}; 

class WingedAnimal : public Animal { 
public: 
    virtual void flap(); 
}; 

// A bat is a winged mammal 
class Bat : public Mammal, public WingedAnimal { 
}; 

Nguồn: wiki.

+1

Điều này được thực hiện với giao diện, tôi không thể sử dụng kế thừa lớp FULL vì nó có thể trong C++. –

+0

@ PhilippSpieß là giao diện nào? –

+0

@ PhilippSpieß cũng, kế thừa toàn bộ lớp là gì? –

2

Một ví dụ trong đó nhiều thừa kế lớp có ý nghĩa là mẫu Observer. Mô hình này mô tả hai diễn viên, người quan sát và người quan sát và người đầu tiên muốn được thông báo khi người này thay đổi trạng thái đối tượng của nó.

Một phiên bản đơn giản thông báo cho khách hàng có thể trông như thế này trong C#:

public abstract class Observable 
{ 
    private readonly List<IObserver> _observers = new List<IObserver>(); 

    // Objects that want to be notified when something changes in 
    // the observable can call this method 
    public void Subscribe(IObserver observer) 
    { 
     _observers.Add(observer); 
    } 

    // Subclasses can call this method when something changes 
    // to notify all observers 
    protected void Notify() 
    { 
     foreach (var observer in _observers) 
      observer.Notify(); 
    } 
} 

này về cơ bản là logic lõi bạn cần phải thông báo cho tất cả các nhà quan sát đã đăng ký. Bạn có thể làm cho bất kỳ lớp nào có thể quan sát được bằng cách bắt nguồn từ lớp này, nhưng vì C# chỉ hỗ trợ kế thừa lớp đơn, bạn bị giới hạn không lấy được từ một lớp khác. Một cái gì đó như thế này sẽ không hoạt động:

public class ImportantBaseClass { /* Members */ } 

public class MyObservableSubclass : ImportantBaseClass, Observable { /* Members */ } 

Trong những trường hợp bạn thường xuyên phải sao chép mã mà làm cho lớp con quan sát được trong tất cả trong số họ, về cơ bản vi phạm Do not Repeat Yourself và Single Point của nguyên tắc Truth (nếu bạn đã làm MVVM trong C#, hãy nghĩ về nó: tần suất bạn thực hiện giao diện INotifyPropertyChanged?). Một giải pháp với thừa kế nhiều lớp sẽ sạch hơn nhiều theo ý kiến ​​của tôi. Trong C++, ví dụ trên sẽ biên dịch tốt.

Uncle Bob wrote an interesting article about this, đó là nơi tôi lấy ví dụ. Nhưng vấn đề này thường áp dụng cho tất cả các giao diện * có thể (ví dụ so sánh, tương đương, đếm được, vv): phiên bản kế thừa nhiều lớp thường sạch hơn trong các trường hợp này, như Bertrand Meyer đã nêu trong cuốn sách của ông ".

Các vấn đề liên quan