program study story

プログラムの勉強 アウトプット

C#_継承について

継承について:

■ 継承とは
あるクラスから性質を受け継いだ新しいクラスを作ることです。

■ コンストラクタ呼び出し

派生クラスのインスタンスが生成される際、
派生クラスのコンストラクタが呼び出される前に
基底クラスのコンストラクタが呼び出されます。

例:

using System;

class Base
{
public Base()
{
Console.Write("base constractor called\n");
}
}

class Derived : Base
{
public Derived()
{
Console.Write("derived constractor called\n");
}
}

class InheritTest
{
static void Main()
{
Derived d = new Derived();
}
}

 

Baseクラスのコンストラクタが呼ばれ、その後、Derivedクラスのコンストラクタが
呼ばれる。

■ 基底クラスのコンストラクタを明示的に呼び出す

派生クラスのインスタンスを生成する際、 自動的に基底クラスの
コンストラクタも呼び出されます。
しかし、この際、呼び出されるコンストラクタは引数なしのコンストラク

→基底クラスの引数付きのコンストラクタを呼び出すためには、
 自分でコードを書いて明示的に基底クラスのコンストラクタを呼び出す必要あり。

■ 基底クラスのメンバーの隠蔽

派生クラスには自由にメンバーを追加することができますが、
基底クラスのpublicメンバーと同名のメンバーを再定義してしまうと、
基底クラスのメンバーが新しく追加されたメンバーに隠れてしまう。

この状態を、「基底クラスのメンバーを隠蔽する」という。

クラスメンバーの隠蔽を行うとき、
メソッドにnew修飾子を付ける必要がある。

class Derived : Base
{
//基底クラスのメンバーを隠蔽するには new を付ける必要がある。
public new void Test()
{
Console.Write("Derived.Test()\n");
}
}

 

BaseクラスのTest()を隠しますよという合図。

■ baseアクセス

baseキーワードを使うと、基底クラスのメンバーを参照できる。
隠蔽されたメンバーを呼び出すこともできる。

class Base
{
public void Test()
{
Console.Write("Base.Test()\n");
}
}

class Derived : Base
{
public new void Test() //基底クラスの Test() と同名のメソッド
{
Console.Write("Derived.Test()\n");
}

public void Test2()
{
this.Test(); // Derived の Test が呼ばれる。
base.Test(); // Base の Test が呼ばれる。
}
}

 

baseアクセスでもインデクサーにアクセスできる。

■ 継承を禁止する
場合によって、絶対に継承されたくないということもある。
クラス定義時に、「sealed」というキーワードをつけることで、継承
を禁止できる。

 

sealed class SealedClass { }

class Derived : SealedClass // SealedClass は継承不可なので、エラーになる。
{
}

 

単一継承:
C#のクラス継承では、1つのクラスしか継承できない。これを
単一継承という。