2008-10-10 20 views
8

मैं अब इस प्रश्न को लंबे समय से पूछ रहा हूं। इसे पोस्ट करने का विचार। सी # एकाधिक विरासत का समर्थन नहीं करता है (यह तथ्य है)। सी # में बनाए गए सभी वर्ग 'ऑब्जेक्ट' वर्ग से बाहर निकलते हैं (फिर एक तथ्य)।सी # - ऑब्जेक्ट क्लास में एकल विरासत?

तो यदि सी # एकाधिक विरासत का समर्थन नहीं करता है, तो हम कक्षा को विस्तारित करने में सक्षम कैसे हैं, भले ही यह ऑब्जेक्ट क्लास को पहले से बढ़ाए? एक उदाहरण के साथ

Illustating:

  1. वर्ग एक: वस्तु - क्लास ए बनाया।
  2. कक्षा बी: ऑब्जेक्ट - कक्षा बी बनाया गया।
  3. कक्षा ए: बी - यह फिर से समर्थित है। ऑब्जेक्ट के पहले सहयोग के साथ क्या होता है।

हम चरण 3 के बाद ए में ऑब्जेक्ट क्लास विधियों का उपयोग करने में सक्षम हैं। तो यह बहु स्तर की विरासत में बदल गया है। बी

  • वर्ग C: बी
  • वर्ग एक: अगर ऐसी बात

    1. वर्ग एक है, तो सी - मैं ए में वर्ग बी के तरीकों का उपयोग करने में कौन सा मामला नहीं है सक्षम होना चाहिए?

    क्या कोई भी समझा सकता है?

  • उत्तर

    6

    जोएल का जवाब सही है। एकाधिक विरासत और विरासत पेड़ (या व्युत्पन्न श्रृंखला) के बीच एक अंतर है। आपके उदाहरण में, आप वास्तव में एक विरासत वृक्ष दिखाते हैं: एक वस्तु पेड़ में एक और वस्तु से प्राप्त (प्राप्त) होती है। एकाधिक विरासत एक वस्तु को कई आधार वर्गों से प्राप्त करने की अनुमति देती है।

    उदाहरण के लिए, निम्नलिखित पेड़:

    public class BaseClass { } 
    
    public class SpecialBaseClass : BaseClass {} 
    
    public class SpecialtyDerivedClass : SpecialBaseClass {} 
    

    यह पूरी तरह से वैध है और कहता है कि SpecialtyDerivedClass SpecialBaseClass (SpecialtyDerivedClass 'माता-पिता) जो, बारी में, BaseClass (SpecialtyDerivedClass से निकला' दादा-दादी) से विरासत।

    एकाधिक वंशानुक्रम के विचार के तहत, उदाहरण इस प्रकार दिखाई देगा:

    public class BaseClass { } 
    
    public class SpecialBaseClass {} 
    
    public class SpecialtyDerivedClass : BaseClass, SpecialBaseClass {} 
    

    यह .NET में अनुमति नहीं है, लेकिन यह कहना है कि SpecialityDerivedClass दोनों BaseClass और SpecialBaseClass से विरासत (जो माता-पिता दोनों कर रहे हैं) ।

    .NET आपको एक से अधिक इंटरफ़ेस से प्राप्त करने की अनुमति देकर एकाधिक विरासत के एक रूप की अनुमति देता है। उदाहरण के थोड़ा ऊपर बदलना:

    public class BaseClass { } 
    
    public interface ISpecialBase {} 
    
    public interface ISpecialDerived {} 
    
    public class SpecialtyDerivedClass : BaseClass, ISpecialBase, ISpecialDerived {} 
    

    यह है कि SpecialtyDerivedClass BaseClass (यह की मूल) है और यह भी ISpecialBase और ISpecialDerived (यह भी माता पिता की लेकिन अधिक इंटरफेस के रूप में कदम-माता पिता की तरह कार्यक्षमता निर्दिष्ट नहीं कर सकते) से विरासत कहते हैं।

    +1

    मेरा भ्रम यह था कि मैं उस सिस्टम को देखने में असफल रहा। ऑब्जेक्ट क्लास ए: बी की विरासत के बाद एक भव्य माता पिता बन गया। स्पष्टीकरण के लिए धन्यवाद। –

    7

    आप विरासत वृक्ष के साथ उत्परिवर्ती विरासत को भ्रमित कर रहे हैं। आप ऑब्जेक्ट के अलावा किसी अन्य चीज़ से प्राप्त कर सकते हैं। यह सिर्फ इतना है कि वस्तु आपके पेड़ के शीर्ष पर वहां बैठी है। और कोई आपकी कक्षा का उत्तराधिकारी हो सकता है, लेकिन क्योंकि ऑब्जेक्ट अभी भी शीर्ष पर है कि वर्ग ऑब्जेक्ट से भी प्राप्त होगा। आपका "बहु-स्तर" विरासत एकाधिक विरासत नहीं है।

    एकाधिक विरासत तब होती है जब आप दो अलग-अलग पेड़ों से प्राप्त होते हैं, और नेट वास्तव में इंटरफेस के माध्यम से फैशन के बाद इसका समर्थन करता है।

    +0

    सी # एकाधिक विरासत का समर्थन नहीं करता है, लेकिन यह कई इंटरफेस का समर्थन करता है। आप अभी भी केवल 1 ऑब्जेक्ट से ही प्राप्त कर सकते हैं। –

    +0

    यह सिर्फ अर्थशास्त्र है। एक इंटरफ़ेस _is_ विरासत का एक कमजोर रूप कार्यान्वित करना। पेड़ के लिए –

    +0

    "पेड़ की शाखा" का चयन करें और इंटरफेस को विरासत में लागू करने के बारे में हिस्सा छोड़ दें। एक इंटरफेस को कार्यान्वित करने का मतलब है कि आपकी कक्षा गारंटी देता है कि यह हस्ताक्षर को परिभाषित करेगा। आप किसी इंटरफ़ेस से किसी भी कोड का वारिस नहीं करते हैं। लेकिन, आपने कहा "फैशन के बाद", तो, मुझे लगता है ... – tvanfosson

    0

    नीचे दिया गया।

    public class A : B 
    { 
    
    } 
    
    public class B : C 
    { 
        public int BProperty { get; set; } 
    } 
    
    public class C 
    { 
        public int CProperty { get; set; } 
    } 
    
    public class Test 
    { 
        public void TestStuff() 
        { 
         A a = new A(); 
    
         // These are valid. 
         a.CProperty = 1; 
         a.BProperty = 2; 
        } 
    
    } 
    

    यह मान्य है। ऑब्जेक्ट इस मामले में सी के लिए आधार है।

    4

    सभी कक्षाएं अंततः ऑब्जेक्ट से प्राप्त होती है। जब आप किसी अन्य वर्ग

    public class A : B 
    

    जहां

    public class B : System.Object 
    

    बी माता पिता वर्ग बन जाता है से निकाले जाते हैं

    public class A 
    

    परोक्ष

    public class A : System.Object 
    

    के बराबर है, और वस्तु दादा-दादी हो जाता है कक्षा ।

    और इसी तरह।

    तो यह सभी अन्य वर्गों के माता-पिता, दादा-दादी, दादा-दादी (आदि) वर्ग है।

    0

    उदाहरण में, बी का विस्तार ए कारण है क्योंकि ए वस्तु को बढ़ाता है। एक वर्ग केवल एक अभिभावक वर्ग निर्दिष्ट कर सकता है, लेकिन उस वर्ग को ऑब्जेक्ट होना चाहिए या उसके पूर्वजों में से एक के रूप में वस्तु होना चाहिए।

    0

    यदि आप बेस क्लास निर्दिष्ट नहीं करते हैं तो ऑब्जेक्ट से कक्षा प्राप्त होती है। इस प्रकार:

    class C {} 
    

    class C : Object {} 
    

    के रूप में ही हालांकि, यदि आप एक आधार वर्ग निर्दिष्ट करने पर, उस वर्ग वस्तु के बजाय से विरासत जाएगा। इस प्रकार,

    class B : C {} 
    

    बी सीधे ऑब्जेक्ट के बजाय सी से विरासत में मिलता है। एक और उदाहरण,

    class A : B {} 
    

    इस मामले में, ऑब्जेक्ट के बजाय बी से विरासत में मिलता है। बी से

    class C {} 
    class B : C {} 
    class A : B {} 
    

    क्लास ए निकला है, जो सी तो क्लास ए से निकला है परोक्ष रूप से सी से ली गई है क्योंकि बी सी सी से ली गई है भी जो निर्दिष्ट नहीं स्पष्ट रूप में वस्तु से प्राप्त: इस पदानुक्रम में संक्षेप में, लेकिन यह डिफ़ॉल्ट रूप से वहाँ है। तो ए अप्रत्यक्ष रूप से ऑब्जेक्ट से भी लिया गया है।

    +0

    एक कक्षा हमेशा अंततः ऑब्जेक्ट से प्राप्त होगी, भले ही आप अपनी खुद की बेस क्लास निर्दिष्ट करें। –

    +0

    हां - आखिरकार - लेकिन सीधे नहीं। मुझे लगता है कि मैंने पिछले पैराग्राफ पर समझाया है। – jop

    0

    सी # में एक कक्षा में केवल एक माता पिता हो सकता है, लेकिन इसमें कई पूर्वजों हो सकते हैं। आप कई इंटरफेस को कार्यान्वित कर सकते हैं, लेकिन इसका मतलब केवल यह है कि आपकी कक्षा उन इंटरफेस द्वारा परिभाषित हस्ताक्षर को लागू करने के लिए सहमत है। आप वास्तव में उन इंटरफेस से किसी भी कार्यक्षमता का वारिस नहीं करते हैं।

    2

    एक तरह से इस पर गौर करने के लिए इस प्रकार है: सी #, एक विरासत पेड़ है, जबकि सी ++ (या अन्य muliple-विरासत भाषाओं) एक विरासत जाली है।

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