講義メモ 第9章 継承

p.223 クラスの継承の基礎

・クラスは部品化に有効だが、きちんと管理しないと(特にチーム開発では)意味が近いクラスが乱立したり、
 同じ処理内容が複数のクラスに記述されて矛盾を起こしやすい。
・この対策として、クラスに親子関係を作り、親から子に情報が引き継がれるようにするのが継承
・親にあたるクラスを基本クラス、子にあたるクラスを派生クラスという
・よって、派生クラスは基本クラスを継承する
・派生クラスの定義時に基本クラス名を指定するだけで、基本クラスにあるメンバが(ほぼ)すべて継承される
・しかも、基本クラスを書き換えると、継承内容も書き変わるので、修正が自動反映する
・よって、派生クラスでは独自のメンバのみ記述すれば良い
 例:
 ①スライムクラスにHPと戦い方を定義
 ②スライムクラスを継承したホイミスライムクラスにMPと呪文を定義(HPと戦い方は継承されるので記述不要)
・派生クラスを継承する派生の派生クラスも記述でき、基本クラスと派生クラスの両方から継承する
・なお、C#等では2つ以上の基本クラスを持つこと(多重継承)は禁止
・逆に、2つ以上の派生クラスを持つことは可能
・継承をインヘリタンスともいう

p.223(クラスの継承)

・定義書式: class 派生クラス名 : 基本クラス名 {…}
・なお、基本クラスにおいてprivate指定のメンバは継承されない

p.224 inheritance01.cs

//p.224 inheritance01.cs
using System;
//基本クラス
class MyBase {
    public int a = 10; //継承可能なデータメンバ
    public void BaseMethod() { //継承可能なメソッド
        Console.WriteLine("ここは基本クラスです");
    }
}
//派生クラス
class MyDerived : MyBase { //MyBaseを基本クラスとする派生クラス
    //ここに「public int a = 10;」が継承される
    //ここに「public void BaseMethod() {…}」が継承される
    public int b = 20; //追加のデータメンバ
    public void DerivedMethod() { //追加のメソッド
        Console.WriteLine("ここは派生クラスです");
    }
}
class inheritance01 {
    public static void Main() {
        MyDerived md = new MyDerived(); //派生クラスのインスタンスを生成
        md.BaseMethod(); //継承したメソッドが派生クラスのインスタンスにある
        md.DerivedMethod(); //追加のメソッドも派生クラスのインスタンスにある
        Console.WriteLine("md.a = {0}", md.a); //継承したデータメンバが派生クラスのインスタンスにある
        Console.WriteLine("md.b = {0}", md.b); //追加のデータメンバも派生クラスのインスタンスにある
        MyBase mb = new MyBase(); //基本クラスのインスタンスも生成できる
        mb.BaseMethod(); //基本クラスのメソッドは基本クラスのインスタンスにある
        Console.WriteLine("mb.a = {0}", mb.a); //基本クラスのデータメンバも基本クラスのインスタンスにある
        //「mb.DerivedMethod();」ならエラーになる
    }
}

p.226 protectedによるデータの保護

・privateなメンバは継承されないが、継承のためだけにpublicにするのは良くない
・そこで、privateと同様に保護しつつ、継承だけは可能とするのがprotected
・そして、継承を禁止したいメンバはprivateにすると良い

p.226 inheritance02.cs

//p.226 inheritance02.cs
using System;
class Base { //基本クラス
    protected int x = 20; //非公開だが継承は可能なデータメンバ
}
class Derived : Base { //派生クラス
    //ここに「protected int x = 20;」があるとみなされる
    int y = 10;
    public void ShowXY() {
        // このクラスからはBaseクラスのxは見える
        Console.WriteLine("x = {0}, y = {1}", x, y);
    }
}
class inheritance02 {
    public static void Main() {
        Derived md = new Derived(); //派生クラスのインスタンスを生成
        md.ShowXY(); //派生クラスのメソッドを実行(内部で基本クラスのデータメンバを利用)
    }
}

p.228 名前の隠ぺい

・派生クラスで基本クラスと同じ名前のメンバを記述できる
・この時に前に「new」を付けることで、名前の隠ぺいとなり「同じ名前にすることで覆い隠す」ことになる
※ 上書きではないので、基本クラスのメソッドを実行する方法も提供されている

p.228 inheritance03.cs

//p.228 inheritance03.cs
using System;
class Base { //基本クラス
    public int x = 10; //継承可能なデータメンバ
    public void BaseMethod() { //継承可能なメソッド
        Console.WriteLine("Baseクラスです");
    }
}
class Derived : Base { //派生クラス
    new public int x = 20; //データメンバの名前の隠ぺい
    new public void BaseMethod() { //メソッドの名前の隠ぺい
        Console.WriteLine("Derivedクラスです");
    }
}
class inheritance03 {
    public static void Main() {
        Derived d = new Derived(); //派生クラスのインスタンスを生成
        Console.WriteLine("x = {0}", d.x); //隠ぺいしたデータメンバが用いられる
        d.BaseMethod(); //隠ぺいしたメソッドが実行される
    }
}

アレンジ演習:p.228 inheritance03.cs

・基本クラスの両メンバをprotectedにしても、名前の隠ぺいが起こること(同じ結果になること)を確認しよう

提出:アレンジ演習:p.228 inheritance03.cs

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です