我在使用泛型时如何理解多态性是如何工作的问题。作为一个例子,我已经定义了以下程序:请帮我理解在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;
这也没有效果。我可以肯定地蒙上了正常MyClass的到IMyInterface的:
MyClass newClass = new MyClass();
IMyInterface myInterface = (IMyInterface)newClass;
所以,至少我还没有完全误解了。我不确定我是如何编写一个接受符合相同接口的类的通用集合的方法。
我有一个计划,要彻底解决这个问题,如果需要的话,但我真的更喜欢正确地做。
预先感谢您。
这就是人们跑出像协变和逆变这样的恐怖词语的地方。 – Greg 2010-08-25 12:27:08
@Greg:从好的方面来说,我觉得自己对这些概念的理解最近已经真正充实了,因为这样的问题已经出现过多! – 2010-08-25 12:28:20
这个概念很好,但名字很可怕。 :) – Greg 2010-08-25 12:59:01