継承を禁忌すること

IS-A IS-A HAS-A - Raganwald
IS-STRICTLY-EQUIVALENT-TO-A - Raganwald

OOP に関する書籍を読むと,たいてい「継承は軽々しく使うべきではない」というようなことが載っている。「継承は IS-A の関係にのみ使うべき」とか,「実装の共有に継承を使ってはならない」とか,「継承よりも合成・包含を優先すべき」とか……。

それが Raganwald に言わせれば,「IS-A の関係は HAS-A の関係と同じこと」とか,「継承は便利機能に過ぎない」とか,「リスコフの置換原則さえ生ぬるい」というような厳しい意見にまでなる(こんな風に言い切ってはいないけれど……まあ,そのようなことを丁寧に説いている)。

このような,制限の無い継承を禁忌する意見は,一般に納得することのできる内容ではある。ただ,それを現場で適用するのは,非常に難しいことのように感じられる。

まず始めに,その思想を共有することが難しい。継承を禁忌する人たちの間でも,その線引きをどこに置くべきかということについては意見が分かれる。そのような曖昧なものを,「継承使ってもいいじゃん」と考えている人たちに対して,納得できるよう説明することはできるだろうか?

そして次に,その思想を自分に強いることが難しい。たしかに継承は便利機能に過ぎなくて,本来不要なものかもしれない。でも,実際すごく便利なんだC++ で継承を避けて合成・包含を優先するように設計を行っていくと,最終的に酷く面倒なことになるケースが多い。継承を避けるのはストイックで安全なやり方かもしれないけれど,なぜ楽にできることを楽にしないのだろうという,妙な矛盾と直面することになる。