2010-06-01 14 views
5

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

+2

अधिकतर समय यदि आपको एकाधिक विरासत की आवश्यकता है, तो आपका डिज़ाइन शायद कुछ हद तक गलत हो सकता है :) –

+0

सी ++ दिनों में, आपको कभी-कभी इसकी आवश्यकता होती है, इंटरफेस –

+2

की कमी के कारण [एकाधिक विरासत के लिए उपयोग?] (http://stackoverflow.com/questions/573913/a-use-for-multiple- विरासत) –

उत्तर

3

ठीक है, यहाँ एक ASP.NET WebForms उदाहरण है::

यहाँ एफिल में एकाधिक वंशानुक्रम पर एक अच्छा लेख है

मैं एक आधार वर्ग, एक वेब नियंत्रण है, चलो यह मान लीजिए एक साधारण TextBox है।

मैं प्रारूपण प्रदान करने के लिए TextBox से प्राप्त करता हूं - RichTextBox

मैं फिर TextBox रखना चाहता हूं जो वर्तनी-जांच - SpellCheckingTextBox कर सकता है।

यदि मुझे SpellCheckingRichTextBox की आवश्यकता है तो क्या होगा? मुझे फिर से वर्तनी जांच या समृद्ध पाठ तर्क लागू करना होगा और एक या दूसरे से प्राप्त होना होगा।

असल में आप उन्हें इंटरफ़ेस के रूप में परिभाषित करेंगे: ISpellCheckingTextBox और IRichTextBox और उन्हें SpellCheckingRichTextBox में लागू करें। आप एक ही चीज़ को पूरा करने के लिए TextBox के लिए एक्सटेंशन विधियां भी लिख सकते हैं।

एकाधिक विरासत मौलिक रूप से त्रुटिपूर्ण है क्योंकि यह वंचित वर्गों को बराबर मानता है। क्या होगा यदि दोनों बेस क्लास में ID फ़ील्ड था?

1

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

यदि आपके पास सार तत्वों के साथ मूल श्रेणी सही ढंग से डिज़ाइन किया गया है और यह पता है कि विरासत वस्तु को केवल उस वर्ग में परिभाषित विधियों की आवश्यकता होगी, तो आपके पास वैध है डिजाइन पैटर्न जो एमआई की आवश्यकता नहीं है।

+0

बहुत कम लोग वास्तव में सी ++ में एमआई का उपयोग करते हैं। वास्तव में, लोग एमआई का उपयोग करना चाहते हैं क्योंकि वे नहीं जानते कि इसे सही तरीके से कैसे किया जाए। –

1

कई विरासत कभी-कभी C++ (और अन्य भाषाओं) में उपयोग किया जाता है ताकि कक्षा को गुणों और एकाधिक आधार वर्गों से कोड प्राप्त हो सके। जब आपके पास इंटरफेस होते हैं, जैसे सी # और जावा में, वास्तव में एकाधिक विरासत की आवश्यकता नहीं होती है, इसलिए यह उन भाषाओं में लागू नहीं किया गया था।

http://archive.eiffel.com/doc/manuals/technology/bmarticles/joop/multiple.html

+0

"कोई ज़रूरत नहीं है" अतिरंजित है: हां, इंटरफेस एमआई प्रदान करता है जो अधिकांश करता है, लेकिन मिश्रणों ऑर्थोगोनल व्यवहार नीतियों के संयोजन के लिए एक शक्तिशाली मुहावरे प्रदान करते हैं।चाहे वह शक्ति "मृत्यु के हीरे" की परेशानियों के लायक है, पूरी तरह से एक और मुद्दा है। –

0

सी # में इसे प्राप्त करने के लिए एक वैध मामला मार्शलबीरफ को व्युत्पन्न वस्तु बनाना है। उदाहरण के लिए, कहते हैं कि मैं निम्न कार्य करने के:

public class FooCorpClass 
{ 
    // This class is defined in a 3rd party library and thus can't be changed 
} 

public class MyFoo : FooCorpClass, MarshalByRef 
{ 
    // I can't do this because MarshalByRef isnt' an interface 
} 

व्यक्तिगत तौर पर मैं शर्म की बात है के रूप में देखते है कि आप एकाधिक वंशानुक्रम अगर वहाँ नहीं टकराव हैं नहीं हो सकता है, या एक टक्कर से निपटने तंत्र है, लेकिन उनमें है टूट जाता है।

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