基本クラスでコンストラクターをオーバーライドするのが難しい半複雑な継承構造があります。次のコードでエラーが表示される場合があります。
public abstract class MyBaseObject
{
public MyBaseObject(MyBaseCollection<MyBaseObject> parent)
{
this.Parent = parent;
}
public MyBaseCollection<MyBaseObject> Parent { get; set; }
}
public abstract class MyBaseCollection<T>
where T : MyBaseObject
{ }
public class MyRealObject : MyBaseObject
{
public MyRealObject(MyRealCollection parent)
: base(parent)
{ }
public new MyRealCollection Parent { get { return (MyRealCollection)base.Parent; } }
}
public class MyRealCollection : MyBaseCollection<MyRealObject>
{ }
つまり、具体的には、MyBaseObject クラスのコンストラクターをオーバーライドできません。MyBaseCollection の代わりに MyRealCollection を渡そうとすることはできません。ジェネリック引数を取り除けば、うまくいきます。MyBaseCollection の代わりに MyRealCollection を使用できます。しかし、コレクション クラスを必要な方法で機能させるには、generics 引数が本当に必要です。