0

次の 2 つのクラスを想像してください。

class A
{
    public A()
    {
    }
}
class B : A
{
    public B()
    {
    }
}

クラス B にパラメーターなしのコンストラクターを強制する方法で、A または代わりにインターフェイスを定義することは可能ですか? または、より一般化すると、特定の署名で型 B のインスタンスを作成できるコンストラクター (または静的メソッド) でしょうか?

クラス B をその署名を使用してのみ構築できるように制限したくはありませんが、クラス B がこの署名で構築できることを確認したいと思います(パラメーターなしでも、特定のパラメーターを指定しても)。

明確にするために:私は実行時にリフレクションやその他の方法を使用してそれを把握する必要がある解決策を探しているわけではありません(問題はありませんが、コードが読みにくくなり、一般的にこの場合は悪い考えのようです)。

これを達成する方法はありますか?

ここで達成しようとしていることについて、より詳細なブログ記事を書きました。

4

3 に答える 3

0

私は少し調査を行い、少なくともある程度満足のいく答えを見つけることができたので、これはフォローアップです.

そのため、しばらく掘り下げて、C# の組み込みのシリアル化/逆シリアル化がどのように機能するかを理解しようとした後、C# には というメソッドがあることがわかりましたGetUninitializedObject()。このメソッドは、そもそもオブジェクトのコンストラクターの呼び出しを回避するだけなので、ハックのように見えますが、少なくとも、当初望んでいたことを達成する方法を提供してくれます。つまり、任意の型のオブジェクトを逆シリアル化できるということです。これを使用して、初期化されていない作成されたオブジェクトでメソッドを使用できます (およびインターフェイスを介してそれらの実装を強制します)。

これは私のニーズに合っていると思いますが、当初望んでいたことはできませんが、目的に合ったパターンを実装できます。

よろしくお願いします

于 2013-09-19T02:57:19.777 に答える
0

You can define factory for instantiating objects of type A (and derived types):

interface IFactory<T> where T : A
{
    T Create(int i);
    T Create(string s);
    // and so on...
}

and require factory implementation, when you want to create an object.
This will make sure calling code in compile time, that it tries to create an object with the given set of parameters.

Of course, there's nothing preventing from NotImplementedException from concrete IFactory<T> implementation at run-time.

于 2013-09-18T18:22:44.543 に答える