継承は悪か?

継承に対しての Matz の回答が参考になった。

「継承で消耗していませんか」とか「差分プログラミングはバッドプラクティス」のようにオブジェクト指向プログラミングの主要素である継承は最近評判が悪いようですが、もう使わないほうが良いのですか? - Quora

この件については、すでに18年も前に Matzにっき(2003-08-06) で書いたことが全てだと思います。

つまり、継承をisa関係にしか使わないという原則に従っていれば問題はほぼなく、逆に一見使い勝手が良さそうに思えるからと言って、isa関係でない機能取り込みに継承を使うと痛い目に遭うということではないでしょうか。

継承を使うべきときには継承を使い、そうでない時にはそれ以外の手段(コンポジションとか)を使うのが正しい態度だと思います。

継承 vs コンポジションは、 is-a関係 vs has-a関係と言い換えるとわかりやすい。

is-a関係 vs has-a関係

Javaのis-aとhas-a関係(オブジェクト指向的な関係)

  1. is-a関係: 継承関係 …サブクラス is a スーパクラス。
  2. has-a関係: 包含関係 …全体クラス has a 部分クラス。

Javaコードで表すと下記の通り。

is-a 関係

class A {
  // クラスA実装
}
class B extends A {
  // クラスB is a クラスA
}
class C extends A {
  // クラスC is a クラスA
}

has-a 関係

class C {
  private D d;       // クラスC has a クラスD

  public void setD(D obj) {
    d = obj;
  }

  public D getD() {
    return d;
  }
}
class D {
  // クラスD実装
}

動画による解説

下記動画の解説が丁寧で良かった。

参考