12

次のタイプのインターフェースを使用するコンクリートはほとんどありません

interface IActivity<T>
{
    bool Process(T inputInfo);
}

具体的なクラスは次のようになります

class ReportActivityManager :IActivity<DataTable>
{
    public bool Process(DataTable inputInfo)
    {
        // Some coding here
    }
}

class AnalyzerActivityManager :IActivity<string[]>
{
    public bool Process(string[] inputInfo)
    {
        // Some coding here
    }
}

次に、IActivityのようなジェネリックインターフェイスを再調整するファクトリクラスを作成するにはどうすればよいですか。

class Factory
{
    public IActivity<T> Get(string module)
    {
        // ... How can i code here
    }
}

ありがとう

4

2 に答える 2

15

ジェネリックメソッドを作成する必要があります。そうしないと、コンパイラはT戻り値のタイプを認識しません。あなたが持っているとき、あなたはTタイプに基づいて活動を作成することができるでしょうT

class Factory
{
    public IActivity<T> GetActivity<T>()
    {
        Type type = typeof(T);
        if (type == typeof(DataTable))
            return (IActivity<T>)new ReportActivityManager();
        // etc
    }
}

使用法:

IActivity<DataTable> activity = factory.GetActivity<DataTable>();
于 2012-11-06T11:55:53.837 に答える
1

多くの場合、これはlazyberezovskyの回答のように実装されます。C ++では、ファクトリが処理しない型を作成しようとしたときに、テンプレートの特殊化を使用してコンパイラエラーを取得できます。

C#ではそれを行うことはできませんが、近づくことはできます。コードは少し意外に見えるかもしれませんが、それが問題になる可能性があります。

public static class Factory {
   public static IActivity<someType> Get(this someType self){
          //stuff specific to someType
   }

   public static IActivity<someOtherType> Get(someOtherType self){
          //stuff specific to someOtherType
   }

   public static T Creator<T>(){
        return null;
   }

}

使用法は次のようになります

IActivity<someType> act = Factory.Creator<someType>().Get(); 

もちろん、これは具体的なタイプを渡すことができる場合にのみ機能します。タイプパラメータを渡す必要がある場合は、さらに複雑になります。

于 2012-11-06T13:06:50.517 に答える