先ほどは「色鉛筆」の例を紹介しました。しかし色鉛筆は鉛筆の一種であると
考えられます。鉛筆でも絵を描くことができますが、色は黒一色です。色鉛筆では
様々な色で絵を描くことができます。つまり、、、
class Color{
int R;
int G;
int B;
}
class Pencil{
int length;
// 黒で絵をかく
void draw(){
:
:
}
}
class ColorPen extends Pencil{
Color color;
// int length; スーパークラスで定義されているので、ここでは定義しない
// colorで絵をかく
void draw(){
:
:
}
}
|
このように定義すると、「色鉛筆クラスは鉛筆クラスの一種」という意味になります。
このように、既存のクラスの一種であるクラスを定義することを「継承」と言います。
色鉛筆クラスには「長さ」が定義されていませんが、鉛筆クラスで定義されていますので、
色鉛筆クラスにも「長さ」が定義されていることになります。
この場合、色鉛筆クラスから見て鉛筆クラスを「スーパークラス」、
「基底クラス」あるいは、「親クラス」と言い、鉛筆クラスから見て
色鉛筆クラスを「サブクラス」あるいは「子クラス」と言います。
実際にプログラムを作ると、クラスが増えていきます。複数のプログラマーが
作る場合には、どのようなクラス関係がなりたっているのかわかりにくくなりますので、
クラス関係を表すために「クラス図」と呼ばれる図を書くことをお薦めします。
この2つのクラスの関係は右図のようになります。
もう1つ例を挙げましょう。
上のクラス図は、基底クラスとして「哺乳類クラス」、その子クラスとして、
「犬クラス」「猫クラス」そして「象クラス」を定義している。さらに「猫クラス」の
子クラスとして「三毛猫クラス」「シャム猫クラス」を定義している。
しかし、「犬クラス」の子クラスとして「盲導犬クラス」、「警察犬クラス」を
定義することはあまりよくありません。なぜならこの場合、動物の種類として継承している
ため、そこに「警察犬」「盲導犬」といった機能で継承することになるからです。
このように異なる分類で継承させる場合、特にJavaでは機能で継承させたい場合には、
継承ではなくインターフェースと言う機能を使います。インターフェースについては
後述します。