मान लें कि मेरे पास दो कक्षाएं हैं जो इस तरह दिखती हैं (कोड का पहला ब्लॉक और सामान्य समस्या सी # से संबंधित है):
class A
{
public int IntProperty { get; set; }
}
class B
{
public int IntProperty { get; set; }
}
इन वर्गों को किसी भी तरह से नहीं बदला जा सकता है (वे तीसरे पक्ष की विधानसभा का हिस्सा हैं)। इसलिए, मैं उन्हें एक ही इंटरफ़ेस लागू नहीं कर सकता, या उसी वर्ग को विरासत में मिला सकता हूं जिसमें फिर इंट्रोपर्टी शामिल होगी।
मैं IntProperty
दोनों वर्गों की संपत्ति पर कुछ तर्क लागू करना चाहता हूं , और सी ++ में मैं एक टेम्पलेट वर्ग का उपयोग कर सकता हूं जो कि काफी आसानी से कर सकता है:
template <class T>
class LogicToBeApplied
{
public:
void T CreateElement();
};
template <class T>
T LogicToBeApplied<T>::CreateElement()
{
T retVal;
retVal.IntProperty = 50;
return retVal;
}
और फिर मैं कुछ ऐसा कर सकता था:
LogicToBeApplied<ClassA> classALogic;
LogicToBeApplied<ClassB> classBLogic;
ClassA classAElement = classALogic.CreateElement();
ClassB classBElement = classBLogic.CreateElement();
इस तरह मैं एकल जेनेरिक फैक्ट्री क्लास बना सकता था जो क्लासए और क्लासबी दोनों के लिए काम करेगा।
हालाँकि, C # में, मुझे दो अलग-अलग where
खंडों के साथ दो वर्गों को लिखना होगा भले ही तर्क के लिए कोड बिल्कुल समान हो:
public class LogicAToBeApplied<T> where T : ClassA, new()
{
public T CreateElement()
{
T retVal = new T();
retVal.IntProperty = 50;
return retVal;
}
}
public class LogicBToBeApplied<T> where T : ClassB, new()
{
public T CreateElement()
{
T retVal = new T();
retVal.IntProperty = 50;
return retVal;
}
}
मुझे पता है कि अगर मुझे where
क्लॉज में अलग-अलग कक्षाएं लेनी हैं, तो उन्हें संबंधित होने की जरूरत है, यानी एक ही क्लास इनहेरिट करने के लिए, अगर मैं उसी कोड को उन अर्थों में लागू करना चाहता हूं, जो मैंने ऊपर वर्णित किया है। यह सिर्फ इतना है कि दो पूरी तरह से समान विधियों का होना बहुत कष्टप्रद है। मैं प्रदर्शन के मुद्दों के कारण प्रतिबिंब का उपयोग नहीं करना चाहता हूं।
क्या कोई व्यक्ति कुछ दृष्टिकोण का सुझाव दे सकता है जहां इसे अधिक सुरुचिपूर्ण ढंग से लिखा जा सकता है?