2012-02-01 9 views
6

मैं जेनेरिक के लिए बहुत नया हूं और मैं एक साधारण वर्ग लिखने की कोशिश कर रहा हूं जो सामान्य होगा लेकिन स्ट्रिंग सदस्य चर पर कुछ विवरणों को क्रमबद्ध करने की अनुमति भी देगा।जेनिक्स और कार्यान्वयन IComparable

इस समय मेरे पास एक मूल वर्ग है लेकिन जब मैं इंटरफ़ेस सदस्य तुलना करने की कोशिश करता हूं तो तुलनात्मक() मुझे शीर्ष पर एक त्रुटि मिलती है जो मुझे बताती है कि यह लागू नहीं किया गया है। यहाँ क्या मुद्दा है?

using System; 

namespace GenericsPracticeConsole.Types 
{ 
    class SortableGenericType<T> : IComparable 
    { 
     private T t; 
     private string stringName; 

     public T name 
     { 
      get { return t; } 
      set { t = value; } 
     } 

     public int CompareTo(SortableGenericType<T> ourObject) 
     { 
      return stringName.CompareTo(ourObject.stringName); 
     } 
    } 
} 

उत्तर

7

दो इंटरफेस IComparable और IComparable<U> रहे हैं है। IComparable पुराना है (जो जेनेरिक से पहले आया था) जिसके लिए अनियंत्रित वस्तुओं के साथ तुलना की आवश्यकता होती है। IComparable<U> को U के उदाहरणों के साथ तुलना करने की आवश्यकता है।

class SortableGenericType<T> : IComparable<SortableGenericType<T>> 
{ 
    // 
} 

आप भी IComparable लागू करना चाहते हैं: आप घोषित करने के लिए है कि आप stringName खेतों पर SortableGenericType के उदाहरण की तुलना करेंगे चाहते हैं यह आपको क्या करना चाहिए है

class SortableGenericType<T> : IComparable, IComparable<SortableGenericType<T>> 
    { 
     private string stringName; 
     public T name { get; set; } 

     public int CompareTo(SortableGenericType<T> ourObject) 
     { 
     //I forgot to add this statement: 
     if(ourObject == null) 
      return -1; 
     return stringName.CompareTo(ourObject.stringName); 
     } 

     public int CompareTo(object obj) 
     { 
     if (obj.GetType() != GetType()) 
      return -1; 
     return CompareTo(obj as SortableGenericType<T>); 
     } 
    } 

यदि आपका वर्ग एक संग्रह था यह T के प्रकारों को रखने के लिए जा रहा है और आपको उन वस्तुओं को ऑर्डर करने योग्य होना चाहिए (यह वह नहीं है जो आप पूछते हैं लेकिन यह सबसे आम परिदृश्य है) TIComparable<T>:

class SomeCollection<T> where T : IComparable<T> 
    { 
     private List<T> items; 

     private void Sort() 
     { 
     // 
     T item1; 
     T item2; 
     if(item1.CompareTo(item2) < 0) 
     { 
      //bla bla 
     } 
     } 
    } 
+0

मैं नहीं करूँगा अगर (obj.GetType()! = GetType()) वापसी -1; ', क्योंकि तब आपकी तुलना एंटीसिमेट्रिक या रिफ्लेक्सिव नहीं है। – porges

+0

सच है। लेकिन मुझे नहीं पता कि मुझे उस मामले में क्या करना है। आपका सुझाव क्या होगा? –

+0

अपने दूसरे तुलना में फ़ंक्शन में आप इस लाइन का उपयोग करते हैं: तुलना करें तुलना करें (ओब्जे सॉर्टेबल जेनरिक टाइप ); क्या यह लाइन वर्तमान में उस मौजूदा वस्तु की तुलना करती है जो हमारे पास वास्तव में लाइन में वर्तमान आइटम को संदर्भित किए बिना पास की गई है? – CSharpened

5

IComparable विधि public int CompareTo(object obj) परिभाषित करता है। पैरामीटर प्रकार पर ध्यान दें - यह object है, न कि आपके स्वयं के प्रकार। यही कारण है कि आप वास्तव में इंटरफेस को लागू नहीं कर रहे हैं।

आप क्या करने की जरूरत को लागू IComparable<SortableGenericType<T>>

+0

बिल्कुल सही। बहुत बहुत धन्यवाद। मैंने माना कि मेरा प्रकार एक वस्तु अपने अधिकार में था कि ऐसा करना ठीक होगा। व्याख्या करने के लिए धन्यवाद। – CSharpened

+1

आपका प्रकार एक वस्तु है, लेकिन यह एक विशिष्ट वस्तु है। IComparable आपको अपने ऑब्जेक्ट की किसी भी ऑब्जेक्ट की तुलना करने की अनुमति देता है, न केवल आपके विशिष्ट प्रकार के लिए। –