2013-05-27 10 views
5

क्षमा करें इस प्रश्न के लिए कोई फंकी शीर्षक नहीं मिला।एकाधिक विरासत और ऑब्जेक्ट्स सी #

मुझे सिखाया गया था कि .Net (C#) एकाधिक विरासत का समर्थन नहीं करता है। लेकिन नीचे foo उदाहरण को देखकर मुझे आश्चर्य है कि यह वास्तव में सच है ??

class fooList 
{ 
    public int Index() 
    { 
     return 0; 
    } 
}  
class foo : fooList 
{ 
    public foo() 
    { } 
} 
class testFoo 
{ 
    void test() 
    { 
     foo obj = new foo(); 

     // From object 
     obj.Equals(obj); 
     obj.GetHashCode(); 
     obj.GetType(); 
     obj.ToString(); 

     // From fooList 
     obj.Index(); 
    } 
} 

हम देख सकते हैं मैं एक वर्ग fooList और एक वर्ग foo जो (सी # एकाधिक विरासत का समर्थन नहीं करता) बातें के अनुसार fooList विरासत वर्ग foo का उद्देश्य केवल एक ही तरीका है जिसके Index() है होना चाहिए है fooList कक्षा से, लेकिन इसमें ऑब्जेक्ट क्लास से अधिक विधियां हैं। यह स्पष्ट रूप से इंगित करता है कि डिफ़ॉल्ट रूप से सभी वर्गों में object वर्ग का उत्तराधिकारी होता है। तो प्रश्न

  1. क्या यह वास्तव में पूरी तरह से सच है कि सी # एकाधिक विरासत का समर्थन नहीं करता है?
  2. मुझे लगता है कि यह सीएलआर स्तर पर इसका समर्थन करता है, यह कोडिंग में का समर्थन क्यों नहीं करता है?
+1

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

+1

'कक्षा fooList'' वर्ग fooList: ऑब्जेक्ट' के लिए एक लघुरूप है। यह आपके भ्रम को दूर करना चाहिए। इंटरफेस को इंगित करने के लिए – user1096188

उत्तर

13

सी # एक स्तर पर कक्षाओं के एकाधिक विरासत का समर्थन नहीं करता है। सी # पदानुक्रम में विरासत के एकाधिक स्तर का समर्थन करता है। आप जो देख रहे हैं वह यह है कि आपकी विरासत के शीर्ष पर System.Object है, जो .NET में कक्षाओं और structs के लिए शीर्ष स्तर की बेस क्लास है।

क्या आप नहीं हो सकता है:

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

क्या आप हो सकता है:

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

मेक भावना?

थोड़ा और पूर्णता के लिए, सी # आपको इंटरफेस के उपयोग के माध्यम से एकाधिक विरासत अनुकरण करने की अनुमति देता है। तो चलो इसे वापस चलें।

class A { } 
interface B { } 
class C : A, B { } // legal 

इस उदाहरण में, सी की घोषणा कानूनी है, और आप विभिन्न सदस्यों को बताया कि इंटरफेस बी सी के भाग के रूप में परिभाषित करता है को लागू करने के

+0

+1। –

4

एकाधिक विरासत नहीं है कि तुम क्या कर रहे हैं की आवश्यकता होगी यहाँ देख रहे हैं। एकाधिक विरासत का मतलब है कि एक वर्ग दो आधार वर्ग से निकला "समानांतर में", हो सकता है इस तरह:

public class Test : Base1, Base2 {} 

संभव नहीं है यही कारण है कि।

आप यहां क्या देख रहे हैं (और यह किसी ऑब्जेक्ट उन्मुख भाषा में काम करता है) यह है कि निश्चित रूप से कक्षा ए सभी संपूर्ण पदानुक्रमों से विधियों और गुणों को प्राप्त करता है।

उदाहरण के लिए:

public class Test : Base {} 

, Base और Object से सभी तरीकों को विरासत में अगर Base सीधे Object से ली गई है।

तो अगर आप इस पदानुक्रम है:

public class Base : Object {} 
public class A : Base {} 

BaseObject से सभी तरीकों और गुण विरासत में, और A सभी तरीकों और Base से गुण और इस प्रकार भी Object से विरासत।

अन्यथा वर्ग पदानुक्रमों का निर्माण करना संभव नहीं होगा।

1

आप बहु लेबल विरासत का उदाहरण दिखा रहे हैं और एकाधिक विरासत नहीं।

एकाधिक विरासत का अर्थ है कि एक वर्ग एक से अधिक कक्षा का उत्तराधिकारी हो सकता है।

class A: B,C 

कौन सी # के मामले में सच नहीं है

1

आप एकाधिक वंशानुक्रम missunderstanding कर रहे हैं। एक वर्ग एक वर्ग का उत्तराधिकारी हो सकता है जो पहले से ही एक और वर्ग प्राप्त करता है। लेकिन एक वर्ग एक ही समय में दो या दो से अधिक विभिन्न वर्गों का उत्तराधिकारी नहीं हो सकता है।

// Default inheritance from Object. 
// Class A inherits System.Object 
class A  

// Simple inheritance. This is not multiple inheritance. 
// Class B inherits class A, which inherits Object 
class B : A  

// Simple inheritance. This is not multiple inheritance. 
// Class C inherits class B, which inherits class A, which inherits Object 
class C : B 

// Default inheritance from Object. 
// Class D inherits System.Object 
class D  

// Multiple inheritance 
// Class E inherits both class A and class D 
class E : A, D 

// Multiple inheritance 
// Class F inherits both class A and class B 
class F : A, B 

// Multiple inheritance 
// Class G inherits both class C and class D 
class G : C, D 
0

इंडेक्स() विधि के अलावा अन्य विधियां ऑब्जेक्ट क्लास से हैं जो सभी संदर्भ प्रकार के साथ-साथ मूल्य प्रकारों के लिए आधार वर्ग है। यह बहुत सच है कि सी # एकाधिक विरासत की अनुमति नहीं देता है लेकिन यह बहुस्तरीय विरासत का समर्थन करता है, फिर यदि हम इंटरफेस का उपयोग कर रहे हैं तो सी # एकाधिक विरासत का समर्थन करता है।

सी # अस्पष्टता को दूर करने के लिए एकाधिक विरासत का समर्थन नहीं करता है जो उत्पन्न हो सकता है यदि दो बेस वर्गों में उनमें एक ही तरीके परिभाषित किया गया है और यह कोड को देखकर भ्रमित होगा कि विधि का कौन सा संस्करण कहा जाएगा। यह link देखें।

इस अनिश्चितता को नीचे दिए गए उदाहरण में दिखाए गए दो इंटरफेस के द्वारा हटाया जा सकता है;

public interface IA 
{ 
    string SomeMethod(); 
} 

public interface IB 
{ 
    string SomeMethod(); 
} 

class MyConcreteClass:IA, IB 
{ 
    string IA.SomeMethod() 
    { 
    return "For IA";  
    } 

    string IB.SomeMethod() 
    { 
    return "For IB";  
    } 
} 

IA concA = new MyConcreteClass(); 
IB concB = new MyConcreteClass(); 

Console.WriteLine(concA.SomeMethod()); // print "For IA" 
Console.WriteLine(concB.SomeMethod()); // print "For IB" 

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

यहां ध्यान देने योग्य एक और बिंदु यह है कि व्युत्पन्न वर्ग में फ़ंक्शन परिभाषा सार्वजनिक नहीं हो सकती है क्योंकि इसे व्युत्पन्न प्रकार के उदाहरण से एक्सेस नहीं किया जा सकता है।

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