ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
オブジェクト指向のはなし

クラスの親子関係

導入

クラスの階層構造の中で注目する必要があるのは、現在扱っているクラスとその1つ上位のクラスだけです。ある機能がどのクラスに由来するものなのか気にする必要はありません。

用語
このトピックでは次の用語を覚えます:
  • スーパークラス (superclass)
  • サブクラス (subclass)
解説

新たに「柴犬」クラスを作成する必要があるとき、もし「生き物」-「動物」-「犬」というクラス階層が既にあるなら、「柴犬」が「犬」を継承するようにします。そうすれば、新規に作らなけらばならない部分が減るからです。

では、「生き物」-「動物」-「犬」-「柴犬」という単純なクラス階層について詳しく観察してみましょう。

  1. 「柴犬」は、「犬」を継承しています。
  2. 「犬」は、「動物」を継承しています。
  3. 「動物」は、「生き物」を継承しています。
  4. したがって、「柴犬」は「犬」の他にも間接的に、「動物」と「生き物」を継承しています。

もっと一般的な言い方をすると、あるクラスはそれよりも上位のクラスを継承しています。このような、上位のクラスのことをスーパークラスと呼びます。「生き物」「動物」「犬」は、「柴犬」のスーパークラスです。

逆に、あるクラスよりも下位のクラスのことをサブクラスと呼びます。例えば、「柴犬」は「犬」のサブクラスです。

サブクラスは、原則的にすべてのスーパークラスの機能を引き継ぎます(「原則的に」と言ったのは、C++ などの言語ではスーパークラスから継承したうちの特定のメソッドを利用禁止にできるためです。これは現実のプログラミング上では重要な技法ですが、ここではもっと基礎的な議論をしたいので無視します)。

「柴犬」は、そのすべてのスーパークラス(すなわち「生き物」「動物」「犬」)の機能を引き継ぎます。しかし「柴犬」クラスのインスタンスを扱う時には、その各機能が実際にどのクラスから継承されたものかについて気にする必要はありません。たとえば、「柴犬」に備わっている「呼吸する」というメソッドが、「生き物」に由来するのか「動物」に由来するのかを気にしなくても良いのです。その機能はすでに「柴犬」の機能だからです。

オブジェクトを利用するときに、クラス階層のことを考える必要はない。

では、クラスを実装する場面ではどうでしょうか?「柴犬」クラスを作るとき、「犬」クラスとその上位のクラスがどのような構成になっているか知る必要があるでしょうか?

実は、その必要はありません。「柴犬」クラスを実装するときには、その直接の上位クラスである「犬」クラスにだけ注目していれば良いのです。「犬」のスーパークラスに由来する機能は、もはや「犬」クラスの機能だからです。

クラスを実装するときは、いま実装しようとしているクラスとその1つ上位のクラスにだけ注目すれば良い。

注目しなければならないクラスはいつでも2階層までなので、クラスがたくさん増えて、クラス階層が大きくなったとしても、複雑さはそれほど増しません。システムが巨大化しても単純で整然とした構造を保ち続けることができるという点が、オブジェクト指向の強みなのです。

(「オブジェクト指向のはなし」は1999年2月から2000年4月にかけて作成されたコンテンツです。)