次のような状況があります。
私の Factory クラスは、CreateStrategy 関数への入力文字列引数に基づいて、適切な Strategy オブジェクトを作成する必要があります。
Strategy1、Strategy2 などはすべて、共通の StrategyBase クラスから派生しています。ただし、各戦略には、Factory クラスの型パラメーターである異なる検証メカニズムがあります。ただし、StrategyValidators は一般的なタイプではなく、異なるインターフェイスを持っています。
したがって、以下のコードでは、StrategyValidator 型に共通の制約を指定できません。
私は C# を初めて使用するため、この設計上の問題を解決するメカニズムが存在するかどうかはわかりません。提案してください
public class Factory
{
//Create the appropriate Concrete Implementation class based on the type
public static StrategyBase CreateStrategy<StrategyValidator>(String Type)
{
StrategyBase EnumImp = null;
// WMI based implementation
if (Type == "Type1")
{
s = Strategy1<StrategyValidator>.Instance;
}
else if (Type = "Type2")
{
s = Strategy2<StrategyValidator>.Instance;
}
return s;
}
private StrategyBase s;
}
使用目的はこちら
Factory f = new Factory();
f.CreateStrategy<WMIValidator>("WMI");
f.CreateStrategy<ABCDValidator>("ABCD");
ここでWMIValidator
、 とABCDValidator
は関連のない型ですが、関数によって作成される実際のクラスはCreateStrategy
、共通のベースを持つなど、階層内で関連していますStrategyBase
問題を説明するためのサンプルコードを次に示します
namespace TestCSharp
{
public interface IStrategy
{
};
public interface S1 : IStrategy
{
void f1();
void f2();
};
public class S1Concrete : S1
{
public void f1() { }
public void f2() { }
}
public interface S2 : IStrategy
{
void f3();
void f4();
};
public class S2Concrete : S2
{
public void f3() { }
public void f4() { }
};
public interface ProductBase
{
};
class Product1<T> : ProductBase where T : S1
{
};
class Product2<T> : ProductBase where T : S2
{
};
public class Factory
{
public ProductBase Create<T>(String Type)
{
if (Type == "P1")
return new Product1<T>();
else if (Type == "P2")
return new Product2<T>();
}
};
class Program
{
static void Main(string[] args)
{
Factory f = new Factory();
ProductBase s = f.Create<S1Concrete>("Type1");
}
}
}
私が得るエラーは
型 'T' は、ジェネリック型またはメソッド 'TestCSharp.Product1' の型パラメーター 'T' として使用できません。'T' から 'TestCSharp.S1' へのボックス変換や型パラメーターの変換はありません。