コンストラクターの継承に関する C# の場合:
- コンストラクターは継承できないことを読みました。
- 基本クラスに 1 つ以上のコンストラクターが含まれている場合、派生クラスは常にそれらの 1 つを呼び出す必要がありますか? 派生クラスが基本クラスのコンストラクターをスキップすることはできませんか?
- 派生クラスは独自のコンストラクターを持つことができますが、基本クラスのコンストラクターの 1 つを呼び出す必要があります。
これらの記述は正しいですか?
コンストラクターの継承に関する C# の場合:
これらの記述は正しいですか?
はい、そうです、コンストラクターは継承されません。したがって、パラメーターなしのコンストラクターがあるからといっObject
て、パラメーターなしのコンストラクターがあるとは限りませんString
。C# 4 仕様のセクション 1.6.7.1 から:
他のメンバーとは異なり、インスタンス コンストラクターは継承されず、クラスには、クラスで実際に宣言されたもの以外のインスタンス コンストラクターはありません。クラスにインスタンス コンストラクターが指定されていない場合は、パラメーターのない空のコンストラクターが自動的に指定されます。
はい、派生クラス コンストラクターのコンストラクター チェーンは、常にその基本クラス コンストラクターを経由しthis(...)
ますbase(...)
。this(...)
またはのどちらも指定しない場合は、基本クラスでパラメーターなしのコンストラクターを呼び出すこととbase(...)
同じです。base()
詳細については、コンストラクター チェーンに関する私の記事を参照してください。
1.コンストラクターを継承する ことはできませんが、コンストラクターをチェーンすることはできます。例:
public class DerivedClass : BaseClass {
public DerivedClass(object arg):base(arg){}
}
2. はい、たとえば、すべてのプライベート コンストラクターを使用してオブジェクトから派生したクラスをインスタンス化することはできません(Jon が以下のコメントで言及している特定のシナリオを除く)。基本クラスのコンストラクターをスキップすることはできませんが、複数のオーバーロードを持つことができ、使用するコンストラクターを選択できます。
3. はい、質問の意味がわかりません。
1 はい
2 コンストラクタをスキップすることはできませんが、デフォルトのコンストラクタでは何もできないと思います。と同じように
public class PClass {
protected PClass() {
// do nothing
}
public PClass(int myIntArg) {
// initialize the class
}
}
public Class CClass : PClass {
public CClass(string myStringArg) : base() {
// initialize the class
}
}
3 はい。私の前の例を見てください。