में जेनेरिक का उपयोग करते समय बहुरूपता को समझने में मेरी सहायता करें मुझे जेनरिक्स का उपयोग करते समय पॉलिमॉर्फिज्म कैसे काम करता है यह समझने में समस्या आ रही है।कृपया C#
public interface IMyInterface
{
void MyMethod();
}
public class MyClass : IMyInterface
{
public void MyMethod()
{
}
}
public class MyContainer<T> where T : IMyInterface
{
public IList<T> Contents;
}
मैं तो ऐसा कर सकते हैं, जो सिर्फ ठीक काम करता है: उदाहरण के लिए, मैं निम्नलिखित कार्यक्रम को परिभाषित किया है
MyContainer<MyClass> container = new MyContainer<MyClass>();
container.Contents.Add(new MyClass());
मैं कई कक्षाओं कि MyInterface को लागू किया है। मैं एक विधि है कि सभी MyContainer वस्तुओं स्वीकार कर सकते हैं लिखने के लिए करना चाहते हैं:
public void CallAllMethodsInContainer(MyContainer<IMyInterface> container)
{
foreach (IMyInterface myClass in container.Contents)
{
myClass.MyMethod();
}
}
अब, मैं इस विधि कॉल करने के लिए करना चाहते हैं।
MyContainer<MyClass> container = new MyContainer<MyClass>();
container.Contents.Add(new MyClass());
this.CallAllMethodsInContainer(container);
यह काम नहीं किया। निश्चित रूप से, क्योंकि MyClass IMyInterface लागू करता है, मुझे बस इसे कास्ट करने में सक्षम होना चाहिए?
MyContainer<IMyInterface> newContainer = (MyContainer<IMyInterface>)container;
यह काम नहीं करता था। मैं निश्चित रूप से IMyInterface एक सामान्य MyClass डाली कर सकते हैं:
MyClass newClass = new MyClass();
IMyInterface myInterface = (IMyInterface)newClass;
तो, कम से कम मैं पूरी तरह से है कि गलत समझा नहीं किया है। मुझे बिल्कुल यकीन नहीं है कि मैं एक ऐसी विधि कैसे लिखूं जो समान इंटरफ़ेस के अनुरूप कक्षाओं का सामान्य संग्रह स्वीकार करता हो।
यदि आवश्यकता हो तो मेरे पास इस समस्या के आसपास पूरी तरह से हैक करने की योजना है, लेकिन मैं वास्तव में इसे ठीक से करना पसंद करूंगा।
अग्रिम धन्यवाद।
यह वह जगह है जहां लोग डरावनी शब्द जैसे कॉन्वर्सिस और contravariance बाहर trot। – Greg
@ ग्रेग: प्लस साइड पर, मुझे लगता है कि इन अवधारणाओं की मेरी * स्वयं * समझ में हाल ही में इस तरह के प्रश्नों के कारण वास्तव में बाहर निकल गया है जो पॉप अप हो रहा है! –
अवधारणाएं अच्छी हैं, लेकिन नाम डरावने हैं। :) – Greg