У меня возникла проблема с пониманием того, как полиморфизм работает при использовании дженериков. В качестве примера, я определил следующую программу:Пожалуйста, помогите мне понять полиморфизм при использовании дженериков в 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
@Greg: С положительной стороны, я чувствую, что мое * собственное понимание этих концепций действительно появилось недавно из-за множества таких вопросов, которые возникали! –
Концепции хороши, но имена страшны. :) – Greg