एक उदाहरण जहां एकाधिक वर्ग विरासत समझ में आता है वह पर्यवेक्षक पैटर्न है। यह पैटर्न दो अभिनेताओं, पर्यवेक्षक और पर्यवेक्षण का वर्णन करता है, और पूर्व को सूचित किया जाना चाहिए जब उत्तरार्द्ध अपनी वस्तु स्थिति बदलता है।
ग्राहकों को अधिसूचित सी # में इस तरह दिख सकता के लिए एक सरलीकृत संस्करण:
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, जहां मुझे उदाहरण मिला। लेकिन यह समस्या अक्सर उन सभी इंटरफेस पर लागू होती है जो सक्षम हैं (उदाहरण के लिए तुलनीय, समतुल्य, समेकित, आदि): बर्ट्रेंड मेयर ने अपनी पुस्तक "ऑब्जेक्ट-ओरिएंटेड सॉफ्टवेयर कंस्ट्रक्शन" में कहा है कि इन मामलों में एक बहु वर्ग विरासत संस्करण अक्सर क्लीनर होता है। "।
आपने [लुचियान ग्रिगोर का उत्तर] स्वीकार किया है (http://stackoverflow.com/a/9360014/2932052), लेकिन क्या आप वास्तव में संतुष्ट हैं? मुझे लगता है कि यह एक बहुत अच्छा सवाल है (+1), लेकिन शायद एसओ के लिए नहीं, क्योंकि इसका वास्तविक जवाब नहीं हो सकता है जो महत्वपूर्ण प्रोग्रामर को समझ सके। – Wolf
मैं बहुत संतुष्ट नहीं हूँ। मुझे दिन में एक महत्वपूर्ण प्रोग्रामर के साथ बहस करना पड़ा और उसे तर्क पसंद नहीं आया। मैंने इसे ईमानदार होने के लिए दिया है: डी –
फिर "उत्तर" को अस्वीकार करना बेहतर हो सकता है जो एक (खराब) विकिपीडिया उदाहरण के एक दुर्लभ सजाए गए उद्धरण से अधिक कुछ नहीं है। शायद भविष्य में वास्तविक उत्तर वाला कोई व्यक्ति होगा - नहीं, शायद मुझे नहीं :-) – Wolf