web-dev-qa-db-ja.com

C#でコンストラクタをオーバーライドすることは可能ですか?

派生クラスで基本クラスのコンストラクターをオーバーライドすることは可能ですか?

もしそうなら、どのようにそれを達成することができ、どのようなユースケースでこれは実用的でしょうか?そうでない場合は、なぜですか?

30
naval

いいえ、コンストラクタをオーバーライドすることはできません。コンストラクタは単に多相的に呼び出されないため、この概念はC#では意味がありません。構築しようとしているクラスとコンストラクターへの引数を常に記述します。

コンストラクターはまったく継承されませんが、派生クラスのすべてのコンストラクターは、同じクラスの別のコンストラクターまたは基本クラスのコンストラクターのいずれかにチェーンする必要があります。これを明示的に行わない場合、コンパイラは基本クラスのパラメータレスコンストラクターに暗黙的にチェーンします(そのコンストラクターが存在しないか、アクセスできない場合はエラーが発生します)。

47
Jon Skeet

いいえ、コンストラクタは継承されません。それらを派生クラスでオーバーライドすることはできません。
理由

すべてのクラスにはbase()コンストラクターを(明示的または暗黙的に)呼び出すコンストラクターが少なくとも1つ必要であり、this()コンストラクターへのすべての呼び出しは最終的にbase()コンストラクター。

15
Ath An

いいえ、コンストラクタをオーバーライドすることはできません。

コンストラクターの基本的な構文を見ると、作成するクラスと同じ名前になっているはずです。

たとえば、基本クラスの名前と同じ名前(基本クラスコンストラクターの名前と同じ)でメソッドを記述します。このメソッドは、戻り値の型が指定されていない派生クラスの新しいメソッドになります。

8
Vizard