2024.02.20
【C#】クラスの継承

UnsplashIan Schneiderが撮影した写真

クラスの継承の基本

最も基本的なクラスの継承の書き方の例です。

■定義

namespace PraClass;

//親クラスの定義
public class ParentClass{
    public void sayHello(){
        Console.WriteLine("Hello");
    }
}

//子クラスを定義
public class ChildClass:ParentClass{
}

■使う

using PraClass;

ChildClass obj = new ChildClass();
obj.sayHello(); //親クラスのメソッドを呼び出す

継承とコンストラクタ

コンストラクタがある場合についてです。

■コンストラクタの処理の順番は「親⇒子」

親、子クラスどちらにもコンストラクタがある場合、

親のコンストラクタの処理 ⇒ 子クラスのコンストラクタ

の順番で処理されます。

 

また、親クラスのコンストラクタに引数がある場合、書き方が少し変わるので、引数無し、引数有りそれぞれの場合で例を記載します。

引数無し

■定義

namespace PraClass;

public class ParentClass{
    public ParentClass(){
        Console.WriteLine("ParantClassがインスタンス化されました!");
    }
}


public class ChildClass:ParentClass{
    public ChildClass(){
        Console.WriteLine("ChildClassがインスタンス化されました!");
    }
}

■使う

using PraClass;

//インスタンス化
ChildClass obj  = new ChildClass();

//出力:
 ParantClassがインスタンス化されました!  //親が先
 ChildClassがインスタンス化されました!   //子が後

引数有り

■定義

namespace PraClass;
public class ParentClass{
    public ParentClass(string parentarg){
        Console.WriteLine("ParantClassがインスタンス化されました! parentarg:" + parentarg);
    }
}


public class ChildClass:ParentClass{                       ↓親のコンストラクタに引数を渡す
    public ChildClass(string parentarg, string childarg):base(parentarg){
        Console.WriteLine("ChildClassがインスタンス化されました !childarg:" + childarg);
    }
}

親クラスのコンストラクタには子クラスのコンストラクタから引数を渡します。

■使う

using PraClass;

//インスタンス化
ChildClass obj  = new ChildClass("親への引数", "子への引数");

//出力
ParantClassがインスタンス化されました! parentarg:親への引数
ChildClassがインスタンス化されました ! childarg:子への引数

オーバーライド

親クラスのメソッドを子クラスで上書きすることをオーバーライドといいます。

以下の2つのキーワードを使うと、オーバーライドできます。

virtual:オーバーライドしたい親クラスのメソッドにつける

override:子クラスのメソッドにつける

例)

namespace PraClass;

//親クラスを定義
public class ParentClass{
    public virtual void sayHello(){
        Console.WriteLine("親、こんにちは!");
    }
}


//子クラスを定義
public class ChildClass:ParentClass{

  //sayHelloメソッドをオーバーライドする
    public override void sayHello(){
        base.sayHello();    //⇐元の処理
        Console.WriteLine("子、こんにちは!");
    }
}

 

 

使う機会は少ないと思うのですが、以下補足です。

子クラスのメソッドに「sealed」をつけると、孫クラスでのオーバーライドを禁止できます。

namespace PraClass;

public class ParentClass{

    public virtual void sayHello(){
        Console.WriteLine("親、こんにちは!");
    }
}

public class ChildClass:ParentClass{
    public sealed override void sayHello()
    {
        // base.sayHello();
        Console.WriteLine("子、こんにちは!");
    }
}

※この場合、孫クラスでsayHello()メソッドをオーバーライドできなくなります。

 

クラスの継承については以上です。