is-a関係、has-a関係

「is-a関係、has-a関係を混同するな」という話はよく聞くのだけど、今までは「そんなの全然違うんだから間違えねぇよ」と思っていた。思い上がりだった。

classA <---(継承)--- classB
classC <>---(包含)--- classD

こんな関係があったとして、簡単にするためにすべてのメソッドとメンバがpublicだとすると、classBのインスタンスはclassAのメンバやメソッドを使える。classCはclassDのメソッドとメンバがすべて使える。つまり、意味を考えずに実行することだけ考えるなら、is-a関係とhas-a関係は入れ替え可能だ。