2012-02-20 20 views
10

मैं एकाधिक विरासत के उपयोग के लिए एक अच्छा उदाहरण खोजने की कोशिश कर रहा हूं जो सामान्य इंटरफेस के साथ नहीं किया जा सकता है।एकाधिक विरासत: एक अच्छा उदाहरण क्या है?

मुझे लगता है कि ऐसा उदाहरण ढूंढना बहुत मुश्किल है जिसे किसी अन्य तरीके से मॉडलिंग नहीं किया जा सकता है।

संपादित करें: मेरा मतलब है, क्या कोई मुझे इस उदाहरण को लागू करने के लिए जितना संभव हो सके इसे लागू करने के लिए एकाधिक विरासत का उपयोग करने की आवश्यकता होने पर मुझे एक अच्छा असली दुनिया का उदाहरण दे सकता है। और इसे कई इंटरफ़ेस का उपयोग नहीं करना चाहिए, जिस तरह से आप C++ में एकाधिक कक्षाओं का उत्तराधिकारी बना सकते हैं।

+1

आपने [लुचियान ग्रिगोर का उत्तर] स्वीकार किया है (http://stackoverflow.com/a/9360014/2932052), लेकिन क्या आप वास्तव में संतुष्ट हैं? मुझे लगता है कि यह एक बहुत अच्छा सवाल है (+1), लेकिन शायद एसओ के लिए नहीं, क्योंकि इसका वास्तविक जवाब नहीं हो सकता है जो महत्वपूर्ण प्रोग्रामर को समझ सके। – Wolf

+1

मैं बहुत संतुष्ट नहीं हूँ। मुझे दिन में एक महत्वपूर्ण प्रोग्रामर के साथ बहस करना पड़ा और उसे तर्क पसंद नहीं आया। मैंने इसे ईमानदार होने के लिए दिया है: डी –

+0

फिर "उत्तर" को अस्वीकार करना बेहतर हो सकता है जो एक (खराब) विकिपीडिया उदाहरण के एक दुर्लभ सजाए गए उद्धरण से अधिक कुछ नहीं है। शायद भविष्य में वास्तविक उत्तर वाला कोई व्यक्ति होगा - नहीं, शायद मुझे नहीं :-) – Wolf

उत्तर

7

निम्नलिखित एक क्लासिक है:

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 { 
}; 

स्रोत: wiki

+1

यह इंटरफेस के साथ किया जाता है, मैं ऐसा कुछ नहीं करता जो पूर्ण वर्ग विरासत का उपयोग करता है क्योंकि यह सी ++ में संभव है। –

+0

@ फिलिपस्पीस जो इंटरफेस हैं? –

+0

@ फिलिपस्पीस भी, पूर्ण श्रेणी विरासत क्या है? –

2

एक उदाहरण जहां एकाधिक वर्ग विरासत समझ में आता है वह पर्यवेक्षक पैटर्न है। यह पैटर्न दो अभिनेताओं, पर्यवेक्षक और पर्यवेक्षण का वर्णन करता है, और पूर्व को सूचित किया जाना चाहिए जब उत्तरार्द्ध अपनी वस्तु स्थिति बदलता है।

ग्राहकों को अधिसूचित सी # में इस तरह दिख सकता के लिए एक सरलीकृत संस्करण:

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(); 
    } 
} 

यह मूलतः कोर तर्क आप सभी पंजीकृत पर्यवेक्षकों सूचित करने की आवश्यकता है। आप इस वर्ग से प्राप्त करके किसी वर्ग को देख सकते हैं, लेकिन सी # केवल एकल वर्ग विरासत का समर्थन करता है, आप किसी अन्य वर्ग से प्राप्त नहीं होने तक सीमित हैं। कुछ इस तरह काम नहीं होगा:

public class ImportantBaseClass { /* Members */ } 

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

इन मामलों में आप अक्सर, कोड है कि उन सभी को में नमूदार उपवर्गों बनाता दोहराने के लिए है मूल रूप से उल्लंघन करने अपने आप को और सत्य के सिद्धांतों का एक बिंदु (दोहराएँ न करें यदि आपने सी # में एमवीवीएम किया है, तो इसके बारे में सोचें: आपने INotifyPropertyChanged इंटरफ़ेस को कितनी बार कार्यान्वित किया?)। एकाधिक वर्ग विरासत वाला एक समाधान मेरी राय में बहुत साफ होगा। सी ++ में, उपर्युक्त उदाहरण ठीक से संकलित होगा।

Uncle Bob wrote an interesting article about this, जहां मुझे उदाहरण मिला। लेकिन यह समस्या अक्सर उन सभी इंटरफेस पर लागू होती है जो सक्षम हैं (उदाहरण के लिए तुलनीय, समतुल्य, समेकित, आदि): बर्ट्रेंड मेयर ने अपनी पुस्तक "ऑब्जेक्ट-ओरिएंटेड सॉफ्टवेयर कंस्ट्रक्शन" में कहा है कि इन मामलों में एक बहु वर्ग विरासत संस्करण अक्सर क्लीनर होता है। "।

संबंधित मुद्दे