このコード例を短くしてみます。
public interface IThing
{
//... Stuff
}
public class Thing1 : IThing
{
}
public class Thing2 : IThing
{
}
public interface IThingView<out T>
{
ICollection<T> ViewAll();
}
public class ThingView<T> : IThingView<T>
{
ICollection<T> ViewAll() { return new List<T>(); } // There's a big operation here
}
public interface IThingViewerFactory
{
public IThingView<IThing> Build(string Which);
}
public class ThingViewerFactory
{
public IThingView<IThing> Build(string Which)
{
if(Which.Equals("Thing1") { return new (IThingView<IThing>)new ThingViewer<Thing1>();}
else { return new (IThingView<IThing>)new ThingViewer<Thing2>();}
}
}
それは私がしていることの大まかな考えです。comonインターフェースに従うビューアを必要とするThingクラスがいくつかあります。名前の付いた文字列を渡して、これらを生成するファクトリが欲しいのですが。コンパイラエラーが発生し続けます:
無効な差異:タイプパラメータ「T」は、「IThingView.ViewAll()」で常に有効である必要があります。「T」は共変です。
これが機能しても、後でキャストする必要があることに気づきました...それで大丈夫です。そして、私はこのアプローチがおそらく必要ではないことを理解しています。この時点で、これはプライド/好奇心の問題になっています。
ありがとう!