У меня проблема с пониманием того, как работает полиморфизм при использовании дженериков. В качестве примера я определил следующую программу:
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;
Так что, по крайней мере, я не совсем неправильно это понял. Я точно не знаю, как мне написать метод, который принимает общий набор классов, соответствующих одному и тому же интерфейсу.
У меня есть план полностью обойти эту проблему, если потребуется, но я действительно предпочел бы сделать это правильно.
Заранее спасибо.