10

http://blog.gurock.com/articles/creating-custom-exceptions-in-dotnet/を読んだばかりです

いつ書かれたのかわかりません。それは言う:

「残念ながら、C#は基本クラスのコンストラクターを継承しないため、この新しい型にはパラメーターのない標準コンストラクターしかなく、したがって比較的役に立ちません。」

これは2010年も同じです:C#:コンストラクターの継承

これはまだ本当ですか?

編集:回答に続いて、デフォルトのパラメーターなしコンストラクターを回避する方法があると確信しています。コンストラクターの継承がない理由は他にありますか?

4

4 に答える 4

14

コンストラクターは、C#言語の存続期間全体で継承できることはありません。これはC#5.0でも変更されていません。C#5.0仕様のセクション1.6.7.1の終わりに、次のように書かれています。

他のメンバーとは異なり、インスタンスコンストラクターは継承されず、クラスには、クラスで実際に宣言されているもの以外のインスタンスコンストラクターはありません。クラスにインスタンスコンストラクターが指定されていない場合、パラメーターのない空のコンストラクターが自動的に提供されます。

ですから、それは今日でも当てはまり、近い将来もそうなると思います。

于 2013-02-08T09:52:07.037 に答える
5

基本クラスがデフォルトのコンストラクターを定義していない限り、基本クラスのコンストラクターを明示的に呼び出す必要があります。そうです、それらは継承されません。

これは、あるコンストラクターから別のコンストラクターに引数を渡す以外に何もしないボイラープレートコードの束につながることがあります

public class NegativArgument : Exception {
     public NegativeArgument() : this("The number given was less than zero"){}
     public NegativeArgument(string message) : this(message,null){}
     public NegativeArgument(string message, Exception inner) : base:(message,inner){}
}

しかし、常に同じメッセージを持つはずの例外タイプがある場合はどうでしょうか。コンストラクターが継承された場合、どのように解決しますか?例外クラスにはメッセージを受け入れるコンストラクターがあるため、新しいExceptionタイプを作成すると、そのコンストラクターも取得されます。コンストラクターを継承しないと、簡単になります。

public class NegativArgument : Exception {
     public NegativeArgument() : base("The number given was less than zero"){}
}

基本クラスにデフォルトのコンストラクターがない場合、基本クラスのコンストラクターを明示的に呼び出さないと、コンパイルエラーが発生します。

于 2013-02-08T09:52:17.030 に答える
1

それらを基本クラスのコンストラクターと明示的に呼び出す必要があります。それらは継承できません。

それらについては何も変更しませんでした。

チェックアウト :Constructors (C# Programming Guide)

仕様§1.6.7.1から:

他のメンバーとは異なり、インスタンスコンストラクターは継承されず、クラスには、クラスで実際に宣言されているもの以外のインスタンスコンストラクターはありません。クラスにインスタンスコンストラクターが指定されていない場合、パラメーターのない空のコンストラクターが自動的に提供されます。

http://msdn.microsoft.com/en-us/library/ms228593.aspx

于 2013-02-08T09:53:39.863 に答える
1

コンストラクターはC#では継承されません。

もしそうなら、すべてのクラスにはデフォルトのパラメーターなしのコンストラクターがあります(すべてのクラスはObjectから派生し、Objectにはデフォルトのパラメーターなしのコンストラクターがあるため)。

多くのクラスは、特定の値でのみ構築する必要があります。これは、すべてのクラスにデフォルトのパラメーターなしコンストラクターがあるかどうかを確認することは不可能です。

于 2013-02-08T09:58:20.510 に答える