1

たとえば、次の 2 つのクラスがあるとします。

public class A
{
    protected static readonly int DefaultValue = 123;

    int value;

    public A()
    {
        value = DefaultValue;
    }

    public A(int _value)
    {
        value = _value;
    }
}

public class B : A
{
    public B(XElement x)
        : base(x.Element("int") == null 
                  ? A.DefaultValue 
                  : (int)x.Element("int"))
    {
    }
}

クラス B のパラメーターなしのコンストラクターを作成できることを理解しています::

public B():base()
{
}

そして、次のようなものがあります:

B objB = (x.Element("int") == null)?new B():new B((int)x.Element("int"));

しかし、このロジックをクラス B にカプセル化したいと考えています。

また、ある種の静的ファクトリ メソッドを実行してカプセル化することもできます (private必要に応じて、これらのクラス B コンストラクターを作成することもできます)。

public static B GetInstance(XElement x)
{
    return (x.Element("int") == null)?new B():new B((int)x.Element("int"));
}

しかし、私は次の疑似コードのようなものを手に入れたいと思っています:

public class A
{
    //don't need this anymore 
    //protected static readonly int DefaultValue = 123;

    int value;

    public A()
    {
        value = 123;
    }

    public A(int _value)
    {
        value = _value;
    }
}

public class B : A
{
    public B(XElement x)
        : x.Element("int") == null
              ? base()
              : base((int)x.Element("int"))
    {
    }
} 

または、同じことを素晴らしく、さらに優れた方法で行うことができる他のアプローチはありますか?

4

2 に答える 2

1

使用される基本コンストラクターを変更できる唯一の条件は、呼び出される実際のコンストラクターです-問題への別のアプローチを見つけてください:)

前述のように、ファクトリ メソッドは 1 つの方法です。また、Ninject (およびおそらく他の DI フレームワーク) では、引数の値に基づいて動的に異なるコンストラクターを選択できると思います。悲しいことに、私は十分な DI の経験がありません..

この場合の別の可能性はint?、インターフェイスを変更する一方でnull、デフォルト値に簡単に結合できるようにすることです。

于 2012-10-01T01:07:54.547 に答える
0

クラス A コンストラクターで null int (int?) をいじってみましたか? オプションのパラメーターを使用すると、1 つのコンストラクターで済む場合があります。

于 2012-10-01T10:42:32.917 に答える