同じルール、
...除いてこれは実際に部材基底クラスの他のメンバーにアクセスするための通常のルールよりも違いはありません。
コンストラクタは、通常の関数ではありません。
主な違いは、派生クラスが自動的に基本コンストラクタを呼び出すことです。具体的には、パラメータを取らない基本コンストラクタです。
コンストラクタが存在しない場合、エラーが発生します。存在してもアクセス権がない場合は、エラーが発生します。
基本クラスに対してコンストラクタをまったく指定しない場合、そのクラスは何もしないパラメータのないコンストラクタを持つとみなされます。
コンストラクタを暗黙的に作成して指定しないと、別の方法で記述します。 - OK - 暗黙のデフォルト空のコンストラクタ
class Base
{
// No constructor explicitly defined so a default constructor is assumed
// Having no constructor at all is like having an empty constructor
// Like this: Base() { }
}
class Derived : Base
{
// OK - Explicitly calling accessible base constructor
public Derived() { }
}
例2 - OK - バリアフリーベース
例3:ここでは
は、あなたがこの問題に直面することはありませんでしょうときの7例がありますコンストラクタ
class Base {
// "public" so it's accessible by derived class
public Base() { } // no parameters - aka parameterless
}
class Derived : Base {
// OK - implicitly calls accessible parameterless constructor base()
public Derived() {}
}
例3 - OK - FAIL - - FAIL - - 常にパラメータなしのコンストラクタ
を呼び出そうとしたプライベート
class Base {
// "private" so it's NOT accessible by derived class
private Base() { } // no parameters - aka parameterless
}
class Derived : Base {
// FAIL - tries to implicitly call parameterless constructor base()
// ERROR CS0122 - Base.Base() is inaccessible due to it's protection level
public Derived() { }
}
例5にアクセスできないまだアクセス
class Base {
// "protected" so it's accessible by derived class
protected Base() { } // no parameters - aka parameterless
}
class Derived : Base {
// OK - implicitly calls accessible parameterless constructor base()
public Derived() {}
}
例4は、保護された手段は、
class Base { // "private" so it's NOT accessible by derived class private Base() { } // no parameters - aka parameterless // "protected" so it's accessible by derived class protected Base(int a) { } // has parameter - aka NOT parameterless } class Derived : Base { // FAIL - STILL tries to implicitly call parameterless constructor base() // ERROR CS0122 - Base.Base() is inaccessible due to it's protection level public Derived() { } }
例6 - FAIL - それが存在しない場合を除き、その後、実施例7他の
class Base
{
// notice there is not parameterless constructor
// just one constructor does does have parameters
// "protected" so it's accessible by derived class
protected Base(int a) { } // has parameter - aka NOT parameterless
}
class Derived : Base
{
// FAIL - STILL tries to implicitly call parameterless constructor base() which doesn't exist
// ERROR CS7036 - There is no argument given that corresponds to the required formal parameter 'a' of Base.Base(int)
public Derived() { }
}
を呼び出すことを前提と - OK - あなたは
class Base
{
// "private" so it's NOT accessible by derived class
private Base() { } // no parameters - aka parameterless
// "protected" so it's accessible by derived class
protected Base(int a) { } // has parameter - aka NOT parameterless
}
class Derived : Base
{
// OK - Explicitly calling accessible base constructor with `int` parameter
public Derived()
: base(10)
{ }
}
しかし、これは、サブクラスがベースキーワード*を使用するように強制されるケースをどのように指摘していますか? – Veverke
@Veverke - そのコンストラクタを 'X'クラスに追加しようとしましたか?その場合は、コンパイルエラーが発生しているはずです。 –
@Damien_The_Unbeliever:このようなコンストラクタを追加すると、現在のYコンストラクタをinパラメータを受け取るように変更するか、パラメータのないコンストラクタをXに追加するように強制します。または、Yの現在の値にbase(0)コンストラクタ。最後のケースでは、あなたが持っていないパラメータを必要とするコンストラクタを呼び出すことはあまり意味がありませんが、ベースキーワード*(これは唯一疑問点です)を使用することを余儀なくされました。 3の少なくともこの第3のシナリオでは、基本キーワード**の使用が強制されています。 – Veverke