2022-08-02 継承は悪か? / is-a関係 vs has-a関係
継承は悪か?
継承に対しての Matz の回答が参考になった。
この件については、すでに18年も前に Matzにっき(2003-08-06) で書いたことが全てだと思います。
つまり、継承をisa関係にしか使わないという原則に従っていれば問題はほぼなく、逆に一見使い勝手が良さそうに思えるからと言って、isa関係でない機能取り込みに継承を使うと痛い目に遭うということではないでしょうか。
継承を使うべきときには継承を使い、そうでない時にはそれ以外の手段(コンポジションとか)を使うのが正しい態度だと思います。
継承 vs コンポジションは、 is-a
関係 vs has-a
関係と言い換えるとわかりやすい。
is-a関係 vs has-a関係
Javaのis-aとhas-a関係(オブジェクト指向的な関係)
- is-a関係: 継承関係 …サブクラス is a スーパクラス。
- 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実装
}
動画による解説
下記動画の解説が丁寧で良かった。