2012-10-02 14 views
7

इस कार्यक्षमता को लागू करना संभव है? मैं दो सार वर्गों है, और मैं दो वर्गों.net अमूर्त कक्षाओं से एकाधिक विरासत

public abstract class A 
{ 
    private void MethodA() 
    { 
     var fool = Prop*2; 
    } 
    public abstract int Prop { get; } 
} 
public abstract class B 
{ 
    private void MethodB() 
    { 
     //.... 
     SomeMethod(); 
     //.... 
    } 
    public abstract void SomeMethod(); 
} 

public class C: A, B 
{ 
    public int Prop { .... } 
    public void SomeMethod { .... } 
} 

मुख्य समस्या यहाँ के सभी सार तरीकों को लागू करने के एक तृतीय श्रेणी के लिए मजबूर करने की जाती है कि लागू किया अंतिम वर्ग तरीकों तो आधार में किया जाता है चाहता हूँ अमूर्त वर्ग, और यह इंटरफेस के साथ हासिल नहीं किया जा सकता है। तो कोई कामकाज नहीं है?

मैंने कई समान q/a पढ़े हैं लेकिन मेरी समस्या का कोई जवाब नहीं है। धन्यवाद

+0

क्लाउडियो ने कहा, एकाधिक विरासत की अनुमति नहीं है। यहां विषय पर कुछ अच्छी पढ़ाई दी गई है: http://blogs.msdn.com/b/dachou/archive/2008/04/17/net-and-multiple-inheritance.aspx – Gromer

उत्तर

10

नहीं, सी # एकाधिक विरासत का समर्थन नहीं करता है। आप कई इंटरफेस को कार्यान्वित कर सकते हैं लेकिन यह स्पष्ट रूप से ऐसा नहीं है क्योंकि इंटरफेस में कोई ठोस व्यवहार लागू नहीं हो सकता है।

+0

यहां मुख्य समस्या यह है कि कार्यान्वित अंतिम कक्षा तब आधार सार तत्वों में विधियों का उपयोग किया जाता है, और यह इंटरफेस के साथ हासिल नहीं किया जा सकता है। तो कोई कामकाज नहीं है? –

+3

@Michele Virgilio: मुझे डर है कि संक्षिप्त जवाब यह है कि आपके वर्गों के एक नए डिजाइन को छोड़कर कोई कामकाज नहीं है। –

1

क्या आपने इसके बजाय कई इंटरफेस का उपयोग करने का प्रयास किया है? यह एक समान स्थिति हो सकती है: Multiple derived abstract classes?

1

यह विशेष रूप से? नहीं, क्योंकि एकाधिक विरासत सी # में समर्थित नहीं है।

निकटतम आप एक अंतरफलक है कि दो अन्य संयुक्त का उपयोग करेंगे मिल सकता है

:

public interface ISomeInterfaceA 
{ 
    int Prop { get; } 
} 

public interface ISomeInterfaceB 
{ 
    void SomeMethod(); 
} 

public interface ICombined : ISomeInterfaceA, ISomeInterfaceB 
{ 

} 

तो फिर तुम प्रकार ICombined के तर्क की आवश्यकता सकता है, लेकिन यह पूरी तरह से क्या आप के बाद कर रहे हैं नहीं मिलता है। उदाहरण के लिए, यह करने के अगर मैं थे करने के लिए:

public class A : ISomeInterfaceA, ISomeInterfaceB 
{ 
    ... 
} 

इस योग्य नहीं होता है, के बाद से मैं स्पष्ट रूप से संयुक्त इंटरफेस, सिर्फ दो इंटरफेस है कि यह से बना है को लागू नहीं किया।

0

आप अंतिम कक्षा में कार्यक्षमता को लागू करने को तैयार हैं, तो आप इंटरफेस बना सकते हैं और आप चाहते हैं के रूप में कई को लागू कर सकते हैं ...

2

आप सी # mixins के माध्यम से में यह कर सकते हैं, यह एकाधिक वंशानुक्रम तुलना में अलग तरह लागू हो जाता है लेकिन अंत में आप कई वर्गों से सभी विधियों के साथ एक वस्तु प्राप्त करते हैं।

यह भाषा की एक विशेषता नहीं है, लेकिन यह तीसरे पक्ष में पाया जा सकता है।

आप my answer to this other question पर इसके बारे में पढ़ सकते हैं, या सीधे re-mix's codeplex

हित के कुछ बिंदुओं पर:
- यदि आप एक Mixin में तरीकों ओवरराइड कर सकते हैं, इस प्रकार बाहर से नव निर्मित वर्गों के व्यवहार को संशोधित।
- आप स्कोप बना सकते हैं जहां दायरे के भीतर बनाए गए वर्ग अलग-अलग होते हैं।
- आपको कारखाने के माध्यम से mixin'd ऑब्जेक्ट्स बनाने की आवश्यकता है (नया MyObject() मिक्सिन को खाते में नहीं लेगा, शुक्रिया)।

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