ジェネリックを使用する場合のポリモーフィズムの仕組みを理解するのに問題があります。例として、次のプログラムを定義しました。
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;
だから、少なくとも私はそれを完全に誤解していません。同じインターフェイスに準拠するクラスのジェネリック コレクションを受け入れるメソッドをどのように記述すればよいか、正確にはわかりません。
必要に応じて、この問題を完全に回避する計画がありますが、適切に実行したいと考えています。
前もって感謝します。