私はちょっとしたコーナーに自分を巻き込んだ。ここで私は(C#で)持っているものの簡易版である:C#でパラメータを使用せずにコンストラクタに情報を渡す
class OuterClass
{
private class BadClass
{
private int Data;
public BadClass()
{
Data = 0;
...
}
}
T Build<T>(Object Input)
{
T x = new T();
...
return x;
}
void SomeMethod()
{
BadClass a = Build<BadClass>(anObject);
...
}
...
}
私が持っている問題は、私は今BadClassインスタンスを作成しているOuterClassのインスタンスに応じて、データの初期値を変更しなければならないということです。通常、私は単純にパラメータを取るBadClassコンストラクタ使用します。
public BadClass(int Data)
{
this.Data = Data;
...
}
をしかし、私はパラメータなしBadClassのコンストラクタを持たなければならないので、私はいくつかの一般的なタイプでBadClassを使用しています。あまりにも悪い私はこのような何かすることはできません:私は、コンストラクタにパラメータを渡すことができないときに
Build<BadClass(5)>(anObject);
を、どのように私は、コンストラクタ実行時の情報を提供していますか?
BadClass型の実行時インスタンスを作成し、必要な情報を与え、それをジェネリック型で使用することはできますか?私は私が働いている場合はinit関数を呼び出すためにビルドでテストを作成することができます私は例の一般的なタイプとしてリストを使用するが、それは完全に私のジレンマの深さを表現していなかった...
:
EDIT BadClassが、それは非常にハッキーです。私はそれについて少し醜い方法を見つけることを望んでいます。
なぜコンストラクタをオーバーロードしませんか? – jle
私はまだ何を達成しようとしているのか分かりません。 Buildメソッドにオブジェクトを渡しているという事実は、私には非常に怪しいものです。あなたが実装しようとしているパターンがありますか? –
これは簡略化されたバージョンです。私は、私が働いている制約を説明しようとしています。 変更された工場パターンです。私は同じ基本クラスを持ついくつかのクラスを持っています。私は、クラスの適切なインスタンスを生成するために、上記のビルドを使用します。 明らかに私がここに示したものより複雑です。ファクトリに渡されるObjectはバイナリツリーのノードです。ファクトリは、BadClassをツリーに挿入する場所を決定し、その他いくつかの処理を行います。いくつかの異なるファクトリ関数があります。私は2段階のコンストラクタを使うことができますが、それは醜いでしょう。 – oillio