猿でも分かる継承の作法

継承は、新しい機能を追加するだけでなく、既存の機能を差し替えることにより、基本クラスを拡張することができます。具体的には、基本クラスのメソッド(あるいはプロパティ)を派生クラスで再定義して、置き換えるというものです。これは「メソッドオーバーライド(override)」と呼ばれます。

 

これは危険な考え方だ。別に嘘を書いている訳ではないがこのような説明がしばしばトラブルの原因となる。よい継承には作法があるのだ。

例えば警察官というクラスがあったとする。

警察官の仕事はいろいろだ。お巡りさんのような制服警官の仕事はパトロールであり科捜研であれば証拠分析だろう。刑事なら犯人確保。それぞれ仕事の内容は違う。

だが共通点もある。それは「パトロール」という仕事も「証拠分析」という仕事も「犯人確保」という仕事も「町の安全を守る」という仕事の一種である、ということだ。

具体的なコードでかけばこうなる。

class 警察官{

  void 仕事(){町の安全を守る} ?この仕事が町のパトロールとは限らない

}

class お巡りさん extends 警察官{

  void 仕事(){町のパトロールをする} ?この仕事は町の安全を守る仕事である

}

class 科捜研の人 extends 警察官{

  void 仕事(){証拠分析をする} ?この仕事は町の安全を守る仕事である

}

class 刑事さん extends 警察官{

  void 仕事(){犯人を確保する} ?この仕事は町の安全を守る仕事である

}

これが継承の作法を守った「よい継承」の例である。

では「悪い継承」とは何か。

例を示そう。こんな継承はすべきではない。

class 泥棒 extends 警察官{

  void 仕事(){他人の家に侵入し金品を奪う} ?この仕事は町の安全を守る仕事ではない

}

できるだけ分かりやすく説明したつもりだが、これではよくわからない、という方もいるだろう。そんな諸君は是非ともメイヤーのオブジェクト指向入門を一読してほしい。