私は以下のように簡略化されたBase
から派生したタイプはほとんどありません。"base"コンストラクタまたは "this"コンストラクタのオーバーロード?
コンストラクタのオーバーロード時に、基本クラスのコンストラクタを使用するか、this
コンストラクタを使用するかはわかりません。
ConcreteB
過負荷が最初の2つのオーバーロードのためthis
を使用しながら
ConcreteA
オーバーロードコンストラクタは、純粋に、base
コンストラクタを使用します。
コンストラクタのオーバーロードにはどのような方法が適していますか?
public abstract class Base
{
public string Name { get; set; }
public int? Age { get; set; }
protected Base() : this(string.Empty) {}
protected Base(string name) : this(name, null) {}
protected Base(string name, int? age)
{
Name = name;
Age = age;
}
}
public class ConcreteA : Base
{
public ConcreteA(){}
public ConcreteA(string name) : base(name) {}
public ConcreteA(string name, int? age) : base(name, age)
{
}
}
public class ConcreteB : Base
{
public ConcreteB() : this(string.Empty, null){}
public ConcreteB(string name): this(name, null){}
public ConcreteB(string name, int? age) : base(name, age)
{
}
}
[編集]それはイアン・クイグリーはanswerが意味をなすように見えた彼に提案したもののように見えます 。 バリデーターを初期化する呼び出しを行う場合、ConcreteA(string)
は以下の場合にバリデーターを初期化しません。
public class ConcreteA : Base
{
public ConcreteA(){}
public ConcreteA(string name) : base(name) {}
public ConcreteA(string name, int? age) : base(name, age)
{
InitializeValidators();
}
private void InitializeValidators() {}
}
これは具体的なコンストラクタで他の初期化を行っていたら意味があるようです。 – Sung
はい、 "this"はその日の終わりに "base"を常に呼び出します。だから "これ"が何もしない場合でも、それは "ベース"に落ちるでしょう –