2011-03-02 8 views
10

मैं समझता हूं कि सी # एकाधिक विरासत का समर्थन नहीं करता है, और समाधान इसके बजाय इंटरफेस का उपयोग करना है। लेकिन मुझे समझ में नहीं आता है कि इंटरफेस हीरा समस्या को उसी तरह नहीं बनाते हैं जैसे एकाधिक विरासत होगा। इंटरफेस का उपयोग कैसे एकाधिक विरासत के नुकसान से बचता है?इंटरफेस का उपयोग कैसे सी # में एकाधिक विरासत की समस्या से उबरता है?

+2

क्षमा करें, लेकिन आपका प्रश्न स्पष्ट नहीं है। क्या आप अपनी समस्या के बारे में और स्पष्ट रूप से बता सकते हैं? – 0x49D1

+0

यह "एमआई" आप किस बारे में बात करते हैं? – RPM1984

+1

@ आरपीएम 1 9 84: शायद एकाधिक विरासत (शीर्षक में एकाधिक इंटरफेस नहीं) – BoltClock

उत्तर

23

एक वर्ग लागू हो सकता है किसी भी इंटरफेस को लागू करें, भले ही वे इंटरफेस अन्य इंटरफेस का विस्तार करें। एकाधिक विरासत केवल कक्षा के साथ संभव नहीं है।

// This is not allowed 
class A { void A() {} } 
class B { void B() {} } 
class C : A, B {} 

// This is allowed 
interface IA { void A(); } 
interface IB { void B(); } 

class A : IA, IB 
{ 
    public void A() {} 
    public void B() {} 
} 

हीरा समस्या वर्गों के साथ मौजूद है क्योंकि टकरा कार्यान्वयन की संभावना है वहाँ (यदि A और B एक ही विधि है और C दोनों है, जो विधि यह ले करता फैली?)। इंटरफेस, दूसरी ओर, केवल एक कार्यान्वयन प्रकार की आवश्यकता होती है ताकि वे घोषित विधियों को प्राप्त कर सकें।

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

interface IA { void Method(int x); } 
interface IB { void Method(int x); } 

class A : IA, IB 
{ 
    public void Method(int x) 
    { 
     Console.WriteLine(x); 
    } 
} 

ध्यान दें कि एक वर्ग अभी भी एक अन्य वर्ग, प्लस इंटरफेस के किसी भी नंबर से प्राप्त कर सकती:

class A : B, IA, IB {} 
+6

आपने यह भी पता लगाया कि वह क्या पूछ रहा था !? :) – tbridge

+4

@ ट्रिब्रिज: यह सिर्फ एक जंगली अनुमान था। – BoltClock

+0

बहाहा! शायद – tbridge

2

एकाधिक इंटरफेस क्योंकि प्रत्येक वर्ग हीरा समस्या नहीं बनाएगा अपने अद्वितीय कार्यान्वयन प्रदान करना होगा, जिसका अर्थ है कि संसाधनों का कोई साझाकरण नहीं है।

सी # एकाधिक विरासत की अनुमति नहीं देता है क्योंकि वे आपकी परवाह करते हैं, और भाषा को शूट-सब-इन-द-पैर-सबूत के रूप में संभव बनाते हैं।

+0

'क्योंकि वे आपकी परवाह करते हैं' का तात्पर्य है कि अन्य भाषाएं 'परवाह नहीं करतीं' जो गैर समझ में नहीं है :) – anthares

+0

@anthares: मुझे लगता है कि गैरकानूनी हिस्सा यह दर्शाता है कि भाषा देखभाल ... –

4

"हीरे समस्या" में केवल एक ही वर्ग और इंटरफेस की असीमित संख्या inherite मौजूद नहीं है, जब सिर्फ इंटरफेस का उपयोग कर कोई अस्पष्ट कार्यान्वयन संभव है क्योंकि वहाँ कर सकते हैं। Wikipedia article पढ़ें, जिसमें एक पूर्ण स्पष्टीकरण शामिल है।

0

यदि आप विरासत के बारे में पूछते हैं: कक्षा केवल एक वर्ग का उत्तराधिकारी हो सकती है, लेकिन किसी भी इंटरफेस को कार्यान्वित कर सकती है। सी # में विरासत और बहुरूपता के बारे में this आलेख देखें।

1

मुझे लगता है कि इस बारे में केवल C# के दायरे में इसके बारे में सोचना उचित नहीं है।

CLR स्वयं एकाधिक विरासत का समर्थन नहीं करता है। ऐसा इसलिए हो सकता है क्योंकि वे अन्य भाषाओं का समर्थन करना चाहते हैं जो वर्तमान में इसका समर्थन नहीं करते हैं या भविष्य में इसका समर्थन नहीं कर सकते हैं।

+0

हालांकि यह मामला और कुछ मूल्य हो सकता है ध्यान में रखते हुए, मुझे नहीं लगता कि यह सवाल का जवाब देता है। मैं इसे एक टिप्पणी के रूप में पोस्ट किया होगा, इसके बजाए। –

+0

@ कोडी ग्रे: वह जानना चाहता है कि क्यों सी # इसका समर्थन नहीं करता है। और यह मेरा जवाब है। – decyclone

0

यह एक ऐसा संभव तरीका है जिसे आप आमतौर पर एकाधिक विरासत के साथ प्राप्त कर सकते हैं।

interface IA 
{ 
    void DoAnything(string name); 
} 

class A : IA 
{ 
    public void DoSomething() 
    { 
     // some code 
    } 
    public void DoAnything(string name) 
    { 
     // Some code 
    } 
} 

class B : IA 
{ 
    public void DoNothing() 
    { 
     // Some code 
    } 

    public void DoAnything(string name) 
    { 
     // Some code 
    } 
} 

class StorageCache : IA 
{ 
    private A ObjA; 
    private B ObjB; 

    public void DoAnything(string name) 
    { 
     ObjA.DoAnything(name); 
     ObjB.DoAnything(name); 
    } 
    public void DoNothing() 
    { 
     ObjB.DoNothing(); 
    } 
    public void DoSomething() 
    { 
     ObjA.DoSomething(); 
    } 
}