2009-09-30 15 views
6

है मेरे पास एक डोमेन मॉडल है जिसका निम्नलिखित रूप से प्रतिनिधित्व किया जाता है।IEquatable <T> कार्यान्वित करना जहां टी एक इंटरफेस

IMyInterface 

ClassA : IMyInterface 

ClassB : IMyInterface 

मैं चाहता हूं कि Iquatable को इस तरह से कार्यान्वित करना है कि मैं कुछ कोड लिख सकता हूं।

if(dynamicallyCreatedInstanceOfClassA == dynamicallyCreatedinstanceOfClassB) 
{ 
    // Do something relevant 
} 

मेरी पहली झुकाव IMyInterface IEquatable लागू लेकिन निश्चित रूप से मैं वास्तव में IMyInterface में लागू करने नहीं कर सकता है करने के लिए किया गया था। मुझे कक्षा और कक्षाबी में ऐसा करना होगा। इस समाधान के साथ मुझे गलत क्या लगता है कि क्लास और क्लासबी में आईक्वाटेबल के कार्यान्वयन बिल्कुल लाइन के लिए लाइन होंगे। क्या इसे पूरा करने का कोई शानदार तरीका है? जब कक्षासी के साथ आता है तो मैं प्रतिलिपि IEquatable कोड की 50 लाइनों की प्रतिलिपि बनाना और पिछले नहीं करना चाहता हूं।

मैंने इंटरफ़ेस की बजाय एक सार आधार वर्ग का उपयोग करने पर विचार किया है, लेकिन इस परिदृश्य में IMyInterface वास्तव में कक्षाओं का प्रदर्शन करने वाले वर्गों का वर्णन करता है और कक्षा नहीं है। कक्षा और कक्षा बी कई समानताओं को साझा नहीं करते हैं, सिवाय इसके कि वे दोनों IMyInterface अनुबंध में कार्रवाइयां कर सकते हैं।

कोई अंतर्दृष्टि सहायक है, और आपके समय के लिए धन्यवाद।

+0

मैंने सार तत्व भी जाने का सुझाव दिया होगा, लेकिन नुकसान यह है कि इससे आपकी व्युत्पन्न कक्षाओं को एक और ठोस वर्ग से विरासत में सीमित कर दिया जाएगा क्योंकि एमआई को सी # में अनुमति नहीं है।'GetHashCode' से संबंधित संभावित समस्या को देखने के लिए सुपरकैट का उत्तर देखें। जॉन का दृष्टिकोण यह लगता है कि यह एकमात्र आसान तरीका है .. – nawfal

+1

@nawfal: जॉन का दृष्टिकोण सही है, क्योंकि यह पूरी तरह से सामान्य है और 'IEqualityComparer 'के लिए अपेक्षाकृत समानता के विस्तृत रूपों का प्रतिनिधित्व करने के लिए अपेक्षित है, जिसे' टी 'कुछ भी नहीं पता के बारे में। उदाहरण के लिए, 'ऑलिस्ट ' को लागू करने के लिए होने वाली दो ऑब्जेक्ट्स शायद ही खुद को एक-दूसरे के बराबर रिपोर्ट करनी चाहिए यदि वे हमेशा एक ही क्रम में एक ही आइटम रखेंगे। यह उपयोगी हो सकता है, हालांकि, किसी ऑब्जेक्ट को सूचियों को स्टोर करने में सक्षम होने के लिए यह 'डिक्शनरी , जहां भी>' है, जहां किसी भी अनुक्रम में एक ही आइटम वाले सूचियां समान की तुलना करेंगी। – supercat

+1

@nawfal: ऐसी कोई तुलना विधि 'IList ' में मौजूद नहीं है; कार्यान्वयन आमतौर पर एक प्रदान नहीं करते हैं। फिर भी, इस तरह की एक तुलना विधि कुछ संदर्भों में उपयोगी हो सकती है, इसलिए इस तरह के फैशन में 'ICEqualityComparer >' लागू करने के लिए बाहरी कक्षा का उपयोग करना उचित होगा। – supercat

उत्तर

7

निकाले जाते है परिभाषित करें IEquatable<T> को लागू करने के बजाय, क्या आप शायद एक अलग वर्ग में IEqualityComparer<T> लागू कर सकते हैं? ज्यादातर मामलों में जहां आप समानता में रुचि रखते हैं, आप इसके बजाय एक तुलनाकर्ता निर्दिष्ट कर सकते हैं, और मुझे संदेह है कि यह इस तरह से क्लीनर होगा।

+0

यह एक अच्छा विचार है जॉन, इनपुट के लिए धन्यवाद। मैंने गहराई में सी # के माध्यम से पढ़ा है, और इसने मुझे उस भाषा के बारे में एक टन सिखाया है जिसे मैंने पहले भी नहीं माना था। मैं बस इसे दूसरी बार पढ़ाने की कोशिश करने के लिए इसे दूसरी बार पढ़ूंगा। –

+0

@ मैथ्यू: आप दूसरे संस्करण के लिए दूसरा संस्करण बाहर होने तक प्रतीक्षा करना चाहेंगे - अन्यथा आपको इसे सभी * तीन * बार पढ़ने की आवश्यकता होगी :) –

+0

यह एक अच्छा मुद्दा है, दूसरे संस्करण पर ईटा क्या है? –

0

मुझे लगता है कि अगर इंटरफ़ेस को एक अमूर्त वर्ग में परिवर्तित नहीं किया जा सकता है, तो यह दो लागू कक्षाओं को एक दूसरे से सीधे या स्वचालित रूप से तुलना करने की अधिक समझ नहीं लेता है। मतलब यह है कि प्रत्येक वर्ग पर एक कस्टम तुलना लागू करने का तरीका होगा। मुझे यकीन है कि आप तुलनात्मक कोड को किसी भी तरह से बाद में बदलना आसान बना सकते हैं।

5

आपके प्रश्न के आधार पर ऐसा लगता है कि आप जानते हैं कि बराबर एल्गोरिदम क्या होगा और यह कक्षा और कक्षा दोनों के लिए बिल्कुल समान होगा। क्यों नहीं निम्नलिखित

  1. IMyInterface परिभाषित IEquatable<IMyInterface>
  2. से प्राप्त करना एक सार आधार वर्ग MyInterfaceBase जो IMyInterface लागू करता है और IEquatable<IMyInterface> कार्यान्वयन
  3. Have ClassA और ClassB MyInterfaceBase
  4. से
+0

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

1

तो IEquatable<T> एक GetHashcode() सदस्य शामिल यह है कि जिस प्रकार की Object.Equals (जैसे से मतभेद "अगर एक, केवल विशेषताओं जो T में मौजूद हैं पर देख रहे थे वस्तुओं एक ही विचार किया जाएगा" के लिए सार्थक अर्थ विज्ञान परिभाषित करने के लिए संभव हो सकता है)। चूंकि यह नहीं है, हालांकि, आमतौर पर उन मामलों को छोड़कर IEquatable<T> को लागू करने का अधिक कारण नहीं है, जहां यह किसी भी quirky semantics को जोड़ने के बिना प्रदर्शन में सुधार कर सकते हैं। अभ्यास में, इसका मतलब है कि IEquatable<T> या तो केवल T द्वारा लागू किया जाना चाहिए (यदि T एक सीलबंद वर्ग या संरचना है), या बिल्कुल नहीं (यदि T विरासत योग्य है, या यदि प्रदर्शन लाभ प्रयास के लायक नहीं हैं)।

+0

+1 .. – nawfal

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