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