私のコードは
public class Parent
{
public Parent(int i)
{
Console.WriteLine("parent");
}
}
public class Child : Parent
{
public Child(int i)
{
Console.WriteLine("child");
}
}
エラーが発生しています:
親には、引数が0のコンストラクタは含まれていません。
この問題は、Parent
には引数が0のコンストラクターがないことを理解しています。しかし、私の質問は、なぜ引数がゼロのコンストラクタが必要なのですか?なぜコードがないと機能しないのですか?
子クラスコンストラクターの一部として親コンストラクターを明示的に呼び出さないため、パラメーターなしの親コンストラクターへの暗黙的な呼び出しが挿入されます。そのコンストラクタは存在しないため、そのエラーが発生します。
状況を修正するには、明示的な呼び出しを追加する必要があります。
public Child(int i) : base(i)
{
Console.WriteLine("child");
}
または、パラメータなしの親コンストラクタを追加することもできます。
protected Parent() { }
子のコンストラクタを次のように変更する必要があります。
public child(int i) : base(i)
{
// etc...
}
親クラスのコンストラクターがパラメーターを取るが、そのパラメーターを子から親に渡していないため、エラーが発生していました。
コンストラクタはC#では継承されないため、手動でチェーンする必要があります。
child
クラスのコンストラクターを次のように変更する必要があります。
public child(int i) : base(i)
{
Console.WriteLine("child");
}
: base(i)
という部分は、int
パラメーターを1つ持つ基本クラスのコンストラクターを使用する必要があることを意味します。これがない場合は、パラメータなしでデフォルトのコンストラクタを使用するようにコンパイラに暗黙的に指示しています。基本クラスにはそのようなコンストラクターが存在しないため、このエラーが発生します。
コンパイラーは、基本コンストラクター引数に何を渡すべきかを推測できません。明示的に行う必要があります。
public class child : parent {
public child(int i) : base(i) {
Console.WriteLine("child");
}
}
デフォルトでは、コンパイラーは基本クラスのパラメーターなしのコンストラクターの呼び出しを試みます。
基本クラスにパラメーターなしのコンストラクターがない場合、自分で明示的に呼び出す必要があります。
public child(int i) : base(i){
Console.WriteLine("child");}
Parentクラスでは、パラメーターなしでコンストラクターを使用できます。
public parent() { }