2010-11-10 12 views
6

मैं दो इंटरफेस है:सी # विरासत सवाल

public interface A { 
void aMethod(); 
} 


public interface B : A { 
void bMethod(); 
} 

बाद में मैं मूल रूप से इस तरह की एक शब्दकोश का उपयोग कर रहा:

Dictionary<int, A> dict = new Dictionary<int, B>(); 

सी # कह रहा है मैं करने के लिए सही से परिवर्तित नहीं कर सकते बाएं, भले ही मैंने इसे डाला। सी # में जेनेरिक का उपयोग करने का कोई तरीका है ताकि यह काम कर सके? अगर मैं उन्हें सार वर्ग बना देता हूं तो यह ठीक लगता है लेकिन मुझे इन्हें इंटरफेस के रूप में चाहिए।

+1

आप .NET का किस संस्करण का उपयोग कर रहे हैं? – Dinah

+0

@ दीनाः फ्रेमवर्क संस्करण इस मामले में कोई फर्क क्यों पड़ेगा? – LukeH

+0

@LukeH: क्योंकि .NET 4.0 में कॉन्वर्सिस और कॉन्ट्रा-वेरिएंस है जो इसे संबोधित कर सकता है। dmurph 4.0 पर होने के बावजूद समस्या आ रही है, तो समस्या अलग होगा की तुलना में अगर इस मुद्दे को पहले से 4.0 – Dinah

उत्तर

11

जो विशेषता आप खोज रहे हैं वह जेनेरिक भिन्नता (कॉन्वर्सिस और contravariance) के रूप में जाना जाता है। How is Generic Covariance & Contra-variance Implemented in C# 4.0?

और यहाँ MSDN entry on Covariance and Contravariance in Generics है: वहाँ .NET फ़्रेमवर्क 4 में इस आरंभिक के लिए सीमित समर्थन यहाँ एक रोचक पोस्ट है।

+0

धन्यवाद, कि मददगार था लग रहा है लगता है जैसे मैं ब्लॉग लिंक के लिए –

7

नहीं, यह एक कॉन्वर्सिस मुद्दा है। यदि आप कर सकते हैं:

Dictionary<int, A> dict = new Dictionary<int, B>(); 

यह एक कंपाइलर त्रुटि के बिना संभव है कि टाइप ए में ऑब्जेक्ट को ऑब्जेक्ट डालें। Dictionary<int, A> लेकिन यह वास्तव में टाइप है Dictionary<int, B>() (ताकि टाइप ए की एक वस्तु रखकर गलत डाली की वजह से एक रनटाइम त्रुटि फेंक), तो आप भी करने के लिए प्रयास करने के लिए अनुमति नहीं होनी चाहिए:

समस्या

dict की तरह लग रहा है कि है dict में टाइप ए की एक वस्तु जगह है, जो आप क्यों नहीं कर सकते हैं:

Dictionary<int, A> dict = new Dictionary<int, B>(); 

यह एक क्रम गलती कर से बचा रहा है।
आप इस विषय पर एरिक Lippert के ब्लॉग की जांच करना चाह: http://blogs.msdn.com/b/ericlippert/

यह बारे में बात करने के लिए अपने पसंदीदा विषयों में से एक है, तो यह काफी पूरी तरह से है।

+0

धन्यवाद किसी अन्य तरीके से मेरी समस्या से निपटने के लिए होगा!यह समझ में आता है –

0

मुझे नहीं लगता कि आपको अपनी समस्या के आसपास एक रास्ता खोजने जा रहे हैं क्योंकि इसके पीछे की सोच त्रुटिपूर्ण लगती है। समझने के लिए, एक और इंटरफ़ेस बना सकते हैं:

Dictionary<int, A> dict = new Dictionary<int, B>(); 

क्या निम्नलिखित जब मैं कोशिश होता है:

public interface C : A 
{ 
    void cMethod(); 
} 

अब, चलो अपने कोड का उपयोग करते हैं?

C c = new ClassThatImplementsC(); 
dict.Add(1, c); 

कई लोगों के लिए Eric Lippert's Covariance and Contravarience FAQ पर एक और नज़र डालें।

+1

वास्तव में यह अलेक्जेंड्रा के एफएक्यू है; मैंने अभी इसे संपादित किया है। –

+0

यह भी बहुत समझ में आता है, धन्यवाद –

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