2012-06-30 19 views
24

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

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

+1

親愛なるエキスパートコーディングは論理から来ています。私はちょうどその領地を尋ねています – naval

+4

他の人はよく答えました。 "chainig"コンストラクタの構文が分からない場合は、 'internal MyClass(s​​tring name):base(null、0、name){...}'のようになります。この例では、コンストラクタは3つのパラメータを持つ基本コンストラクタを呼び出します。 –

+0

投票者を再度開く:投票を再開する前に、質問を通常の基準に変更してください。 –

答えて

43

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

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

+4

"コンセプトは理にかなっていません。本当にコンストラクタは多態的に呼び出されません。デルファイでは、彼らはそうです。これは非常に便利な機能であり、リフレクションを使用してランタイムチェックされた 'Type'インスタンスを渡すか、別のファクトリクラスを提供することによって、C#で回避策が見つけられます。 –

+3

@ O.R.Mapper:まあ、私はC#の文脈で話していました。他のどの言語がこの答えに無関係であるか。 –

+3

その場合、私は、答えは "概念が理にかなっていない、本当に"、それはかなり一般的に聞こえると主張しないことを提案する。コンセプトは多分意味がありますが、コンストラクタが多態的に呼び出されるわけではないので、C#でコンセプトを利用することはできません。もっと明白かもしれない。 –

10

いいえ、コンストラクタは継承されません。派生クラスでそれらをオーバーライドすることはできません。
すべてのクラスは、ベース()コンストラクタ(明示的 または暗黙的に呼び出す 少なくとも1つのコンストラクタを持たなければならないので、基本コンストラクタは常に、 オブジェクトから派生するすべてのクラスのために、呼び出されます

理由)そしてthis()コンストラクタへのすべての呼び出しは、最終的には というbase()コンストラクタを呼び出さなければなりません。

+0

関連性の高い説明のためにUpvoted !! – KillABug

6

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

コンストラクタの基本的な構文を見てみると、作成するクラスと同じ名前にする必要があります。

基本クラス(基本クラスのコンストラクタの名前と同じ名前)のメソッドを記述すると、戻り値の型が指定されていない派生クラスの新しいメソッドになります。構文的には間違っている。

+0

簡単な説明のためにUpvoted。!! – KillABug

関連する問題