汎用クラスとインターフェースの非汎用バージョン
-
05-07-2019 - |
質問
私は、一般的なインターフェースまたはクラスを作成し、このクラスまたはインターフェースの異なるバージョンを非一般的な方法で使用したい状況にいることがよくあります。たとえば、次のようなインターフェイスがあります:
interface ICanCreate<T>
{
T NewObject();
}
これにより、クラスをそのタイプのファクトリにすることができます。次に、これらを一般的なファクトリクラスに登録したいので、次のように書きます:
public class Factory
{
private Dictionary<Type, ICanCreate> mappings; // what do I put here????
public void RegisterCreator<T>(ICanCreate<T> creator)
{
}
public T Create<T>()
{
}
}
辞書では、どのタイプを値に使用しますか?ある種の設計原則が欠けているかどうかはわかりませんが、これはco(ntra?)分散と関係があることがわかります。ヘルプやアイデアをいただければ幸いです。
解決
ディクショナリ宣言でobject
を使用する必要があります(すべてプライベートで、あなたはそこに間違った種類のものを入れないことを確認できます)またはnon -generic ICanCreate
ICanCreate<T>
が拡張するインターフェース。
基本的には、C#で表現できない型の関係が必要です。それが起こると、やや不快な解決策になりますが、ここでさを分離できるように見えます(つまり、単一のクラス内に保持できます) )。
他のヒント
興味深いことに、これはC#4.0で解決された問題です。
public interface ICanCreate<out T> // covariant
{
T NewObject();
}
public class Factory
{
private Dictionary<Type, ICanCreate<object>> mappings = new Dictionary<Type, ICanCreate<object>>();
public void RegisterCreator<T>(ICanCreate<T> creator) where T:class
{
mappings[typeof(T)] = creator;
}
public T Create<T>()
{
ICanCreate<object> creator = mappings[typeof(T)];
return (T) creator.NewObject(); // I do not think you can get rid of this cast
}
}
所属していません StackOverflow