1. ホーム
  2. c#

[解決済み] コンストラクタを継承する方法は?

2022-04-14 03:41:20

質問

想像してみてください 多くのコンストラクタと仮想メソッドを持つ基底クラスです。

public class Foo
{
   ...
   public Foo() {...}
   public Foo(int i) {...}
   ...
   public virtual void SomethingElse() {...}
   ...
}

そして、その仮想メソッドをオーバーライドする子孫クラスを作りたいのです。

public class Bar : Foo 
{
   public override void SomethingElse() {...}
}

そして、もうひとつの子孫は、さらにいろいろなことをします。

public class Bah : Bar
{
   public void DoMoreStuff() {...}
}

本当にFooからBarとBahにすべてのコンストラクタをコピーする必要があるのでしょうか?そして、Foo のコンストラクタのシグネチャを変更したら、Bar と Bah でもそれを更新しなければならないのでしょうか?

コンストラクタを継承する方法はないのでしょうか?コードの再利用を促進する方法はないのでしょうか?

どうすれば解決するの?

はい、各派生に意味のあるコンストラクタを実装し、その上で base キーワードを使用して、そのコンストラクタを適切な基底クラスまたは this キーワードを使用すると、 コンストラクタを同じクラスの別のコンストラクタに振り向けることができます。

もしコンパイラがコンストラクタの継承について仮定していたら、私たちはオブジェクトがどのようにインスタンス化されるかを適切に判断することができません。ほとんどの場合、なぜそんなに多くのコンストラクタがあるのかを考え、ベースクラスで1つか2つだけに減らすことを検討すべきです。派生クラスでは、次のような定数値でその一部をマスクすることができます。 null を作成し、必要なものだけをコンストラクタで公開します。

更新情報

C#4 では、デフォルトのパラメータ値を指定し、名前付きパラメータを使用することで、構成ごとに 1 つのコンストラクタを持つのではなく、複数の引数構成に 1 つのコンストラクタで対応できるようになりました。