そのため,既に存在するオブジェクトの「性質」を再利用することが,有効か つ自然な表現であることが考えられる.その再利用のことを 継承 (inheritance) という. 「クラスベース」のオブジェクト指向言語の場合は,雛形であるクラスにより その「性質」を表現しているので クラス継承(class inheritance) とも いう.
例えば,上で定義したクラス Airplane を外から制御可能な飛行機 としてみよう.
class ControledAirplane inherits Airplaneinherits の次に示した名前( Airplane) より親クラスを示す. 親クラスに対して,子クラスのことを サブクラス(sub-class) という. サブクラスで定義した状態,メソッド以外の状態,メソッドは全て, 親クラスのそれを使う(継承する). このように,任意のクラスの子クラスを作り,状態,メソッドを継承すること ができる.
method スピードを増せ. is
スピードを増す. end
method スピードを落とせ. is
スピードを落とす. end
end
では Java で書いてみよう.しかし簡単には定義することはできない. まず,仮想的に定義したクラス同様にクラス ControledAirplane を定義すると以下のようになる.
class ControledAirplane extends Airplane { ControledAirplane(Tree t) { super(t); } public void Increment() { Speed++; } public void Decrement() { Speed--; } }
クラス | 状態 | メソッド |
Controled | Speed | Flying() |
Airplane | Col | WhatIsYourSpeed() |
knownTree | WhatIsYourColor() | |
Upper | Increment() | |
Decrement() |
ControledAirplane a = new ControledAirplane(t);更に,このクラス定義では親クラスの変数 Speed を更新しているが, この変数宣言も private から protected に変更する必要がある. このように,継承される可能性のある変数は protected または public で宣言する必要がある.ここでは,クラス Airplane 内の変数 Speed を protected で定義しよう.
protected int Speed;
結果として, ControledAirplane のインスタンスを生成するので, 以下のように挙動を変更してみよう.
for(int i=0;i<21;i++) { for(int j=0;j<10000;j++){} p.Seeing(); a.Flying(); if(i==4) a.Increment(); }その結果,以下のような実行結果となる.
TStatus: false,ASpeed: 0,AColor: White TStatus: true,ASpeed: 1,AColor: White TStatus: true,ASpeed: 2,AColor: White TStatus: true,ASpeed: 3,AColor: White TStatus: true,ASpeed: 4,AColor: White TStatus: true,ASpeed: 6,AColor: White TStatus: true,ASpeed: 7,AColor: White TStatus: true,ASpeed: 8,AColor: White TStatus: true,ASpeed: 9,AColor: White TStatus: true,ASpeed: 10,AColor: White TStatus: true,ASpeed: 9,AColor: White TStatus: true,ASpeed: 8,AColor: White TStatus: true,ASpeed: 7,AColor: White TStatus: true,ASpeed: 6,AColor: White TStatus: true,ASpeed: 5,AColor: White TStatus: true,ASpeed: 4,AColor: White TStatus: true,ASpeed: 3,AColor: White TStatus: true,ASpeed: 2,AColor: White TStatus: true,ASpeed: 1,AColor: White TStatus: false,ASpeed: 0,AColor: White TStatus: false,ASpeed: 0,AColor: White TStatus: false,ASpeed: 0,AColor: White