【C#】継承

文法


class 派生クラス名 : 基底クラス{}

継承とは

あるクラスを元(基底)として新しいクラス(派生)を作成すること
派生クラスのインスタンスは暗黙的に基底クラスのインスタンスを持つ
このため、基底クラスのメンバにもアクセスすることができる

隠蔽

派生クラス側で、基底クラスのpublicメンバと同名のメンバを再定義すること。
メンバの実体が1つに収束するわけではなく、基底クラスと派生クラスのメンバが重複している。
例)基底クラス

class MyBase
{
    public void Exec() => System.Console.WriteLine("This is Base.");
}
例)派生クラス

class MyInheritance : MyBase
{
    public void Exec() => System.Console.WriteLine("This is Inheritance.");
}
メンバの隠蔽では、基底クラスと派生クラスのメンバが重複しているため、どちらが使われるかは、型によって決定される。

class Program
{
    static void Main()
    {
        MyBase mb = new MyInheritance();
        mb.Exec(); // This is Base.
        MyInheritance mh = new MyInheritance();
        mh.Exec(); // This is Inheritance.
        auto mh2 = new MyInheritance();
        mh2.Exec(); // This is Inheritance.
    }
}

明示的な隠蔽

意図しない隠蔽である場合もあるため、上記の例の場合にコンパイラは警告を発してくれる。
コンパイラ(他の開発者にも)に意図した隠蔽であることを伝えるためには「new 修飾子」を用いる。

class MyInheritance : MyBase
{
    public new void Exec() => System.Console.WriteLine("This is Inheritance");
}

継承の禁止

現在のクラスを継承されたくない場合は「sealed 修飾子」を用いる。

sealed class MyBase
{
    public void Exec() => System.Console.WriteLine("This is Base.");
}
これで、以下のコードはエラーになる。

class MyInheritance : MyBase{}

多重継承の禁止

派生クラスは暗黙的に基底クラスのインスタンスを持っているため、C#では多重継承を禁止している。