格納するオブジェクトに基づいて異なる実装を持つ次のクラスがあるとします。
public class ListOfPersistent<T> :
IList<T> where T : Persistent {... implementation ...}
public class ListOfNonPersistent<T> :
IList<T> {... implementation ...}
そして、次のようなことをして、上記のクラスで別のバージョンのいずれかを使用したいと思います。
public class PersistentList<T> : IList<T> {
protected PersistentList() {
if (list != null) {
return;
}
if (Extensions.IsPersistent<T>()) {
list = new ListOfPersistent<T>();
} else {
list = new ListOfNonPersistent<T>();
}
}
protected IList<T> list;
....
}
もちろん、最初のクラスには型制約があり、2 番目のクラスには型制約がないため、上記はコンパイルされません。私ができる方法はありますか: この特定のケース ( list = new ListOfPersistent<T>()
) の制約をチェックしないようにコンパイラーに伝えるか、コードが問題なくコンパイルされるように、共分散/反分散マジックを実行しますか?