0

私は最近、パラメーターを持つコンストラクターに関する「where」制約をバイパスするジェネリックファクトリーに取り組んでいますが、間違いのために、私はよくわからないことに遭遇し、誰かが光を当てることができるかどうか疑問に思いましたその上に。

問題のコード行は次のとおりです。

ITestInterface myObj = new GenericFactory<ITestInterface>(
    () => (new TestClass("username", "password"))
).CreateObject() as ITestInterface;

ITestInterface myNewObj = new GenericFactory<ITestInterface>(
    (string x, string y) => (new TestClass(x, y))
).CreateObject("username ", " password") as ITestInterface;

これらの行はどちらも同じことをしますが、最初の行は失敗すると予想していました。

工場出荷時のコードは次のとおりです。

public GenericFactory (Func<T> getNewT)
{
   _getNewObject = getNewT;
}

public GenericFactory(Func<string, string, T> getNewT)
{
   _getNewObjectTwoParams = getNewT;
}

public T CreateObject ()
{
   if (_getNewObject == null)
   {
      return default(T);
   }
   else
   {
       return _getNewObject();
   }
}

public T CreateObject (string username, string password)
{
   if (_getNewObjectTwoParams == null)
   {
      return default(T);
   }
   else
   {
      return _getNewObjectTwoParams(username, password);
   }
}

TestClassには、次のコンストラクターがあります。

public TestClass (string name, string password)
{
   _name = name;
   _password = password;
}

工場への最初の電話がうまくいく理由に誰かが光を当てることができれば、私は非常に感謝しています。

ありがとう。

4

1 に答える 1

2

これは確かに、次のようなオーバーヘッドが大きいように思われます。

ITestInterface test = new TestClass("username", "password");

ただし、正常に機能している理由は、最初のコンストラクターオーバーライドを使用しているためです。

public GenericFactory (Func<T> getNewT)

Func<T>のインスタンスを返すものならどれでも渡すことができますT。その関数内でさらに多くのことを行うことができます。

ITestInterface myObj = new GenericFactory<ITestInterface>(
    () => {
    var username = GetMyUserName();
    var password = GetMyPassword();
    return new TestClass(username, password)
}).CreateObject() as ITestInterface;
于 2012-05-02T14:50:58.760 に答える