2010-01-11 10 views
6
की सूची

मैं जैसे वर्गों को लागू करने के एक जोड़े के साथ एक सामान्य इंटरफ़ेस है:जेनेरिक इंटरफेस

public interface IDataElement<T> 
{ 
    int DataElement { get; set; } 
    T Value { get; set; } 
} 

public class IntegerDataElement : IDataElement<int> 
{ 
    public int DataElement { get; set; } 
    public int Value { get; set; } 
} 

public class StringDataElement : IDataElement<String> 
{ 
    public int DataElement { get; set; } 
    public String Value { get; set; } 
} 

गुजर का सहारा के बिना, भिन्न प्रकार के लागू करने कक्षाओं का एक संग्रह पारित करने के लिए यह संभव है वस्तु के रूप में।

यह रूप में

public IDataElement<T>[] GetData() 

या

public IDataElement<object>[] GetData() 

कोई सुझाव एक वापसी मूल्यों को परिभाषित करना संभव प्रतीत नहीं होता है?

उत्तर

4

आप निश्चित रूप से घोषणा कर सकते हैं:

public IDataElement<T>[] GetData<T>() 

और

public IDataElement<object>[] GetData() 
  • हालांकि शायद बाद आप के बाद (अपने इंटरफेस भी सी # में संस्करण नहीं होगा क्या कर रहे हैं नहीं कर रहा है 4 क्योंकि यह इनपुट और आउटपुट स्थिति दोनों में T का उपयोग करता है, भले ही यह भिन्नता हो, आप वैल्यू प्रकारों के लिए उस भिन्नता का उपयोग नहीं कर पाएंगे)। पूर्व को कॉलर को <T> निर्दिष्ट करने की आवश्यकता होगी, उदा।

    foo.GetData<string>();

है कि आप के लिए ठीक है?

"वस्तु का संग्रह है, जिनमें से प्रत्येक को लागू करता है एक अलग टी के लिए IDataElement<T>" जब तक आप भी यह एक nongeneric आधार वर्ग, जिस पर आप सिर्फ IList<IDataElement> इस्तेमाल कर सकते हैं देना व्यक्त करने का कोई तरीका नहीं है। इस मामले में nongeneric IDataElementDataElement संपत्ति सामान्य इंटरफ़ेस में Value संपत्ति छोड़ने हो सकता था,:

public interface IDataElement 
{ 
    int DataElement { get; set; } 
} 

public interface IDataElement<T> : IDataElement 
{ 
    T Value { get; set; } 
} 

है कि आपके विशेष स्थिति में उपयोगी है?

यह स्पष्ट नहीं है कि आप अपने तत्वों को जानने के बिना डेटा तत्वों के संग्रह का उपयोग कैसे करना चाहते हैं ... अगर उपर्युक्त आपकी मदद नहीं करता है, तो शायद आप संग्रह के साथ क्या करने की अपेक्षा करते हैं, इसके बारे में और अधिक कह सकते हैं।

+0

मैंने गैर-सामान्य आधार वर्ग की कोशिश की थी लेकिन यह मूल्य संपत्ति – benPearce

+0

@benPearce का विवरण खो देता है: लेकिन आप इसका उपयोग नहीं कर सकते हैं, क्योंकि आप शामिल प्रकार को नहीं जानते हैं। कृपया यह दिखाने का प्रयास करें कि आप कोड का उपयोग कैसे करेंगे, और फिर हम आपको बेहतर सलाह दे सकते हैं। –

+0

ऑब्जेक्ट GetValue() और SetValue (ऑब्जेक्ट) विधियों के साथ, मैं गैर-सामान्य आधार इंटरफ़ेस को नीचे चला गया। अब तक काम कर रहे हैं – benPearce

3

नहीं यदि आप ऐसा नहीं कर सकते हैं - केवल विकल्प या तो एक गैर सामान्य इंटरफ़ेस का उपयोग कर रहे हैं:

public interface IDataElement 
{ 
    int DataElement { get; set; } 
    object Value { get; set; } 
} 

वैकल्पिक रूप से एक आवरण बना सकते हैं और तरीकों कि प्रकार वे आवश्यकता होती है पता चला है कि पारित:

public class DataElementBag 
{ 
    private IDictionary<Type, List<object>> _elements; 
    ... 
    public void Add<T>(IDataElement<T> de) 
    { 
     Type t = typeof(T); 
     if(!this._elements.ContainsKey(t)) 
     { 
      this._elements[t] = new List<object>(); 
     } 

     this._elements[t].Add(de); 
    } 

    public void IEnumerable<IDataElement<T>> GetElementsByType<T>() 
    { 
     Type t = typeof(T); 
     return this._elements.ContainsKey(t) 
      ? this._elements[t].Cast<IDataElement<T>>() 
      : Enumerable.Empty<T>(); 
    } 
} 
संबंधित मुद्दे