シンタックスの話ではないのですが、クラスで継承と合成ってありますよね。
その使いわけがわかりません。勉強している本をみても、メリット・デメリットというか、
どういう状況でどっちを使うのが適しているか等、特にそういう説明がのっていません。
もともとあるクラスにちょっとファンクションを追加するような課題を、継承と合成
のそれぞれで書いたのですが、感じたのは、どっちでも同じようなもの? という
印象でした。
どういった使い分けをするのが適しているのか、もしご存知なら教えてください。
よろしくお願いします。
(環境というのは関係なさそうなので省いてもよろしいですか?)
ttp://next1.cc.it-hiroshima.ac.jp/CPPPUBLISH/node13.html
ここを読んでください。
継承はあくまで is_a 関係の時にやるべき、
コンポジションはそうでないときでもできる。
・・・という説明がなされる時が多いですが、
たとえば自動車があるとして、そこにエアコンをつけるとします。
そのときには
『エアコンのある自動車』is a 『自動車』
なので、継承を用いて
『エアコンのある自動車』
クラスを作ってそこにエアコンのコードを書けばいいか、というと、
それはよい考えではありません。
これは has_a 関係、
『エアコンのある自動車』は『エアコン』をもっている。
と考え、コンポジションを用いるのです。
『何が違うんじゃボケェ!』という声が聞こえてきそうですが、
そのクラスのインスタンスができてしまってから、
そのインスタンスのクラスを変えることはできないため、
継承を用いて機能追加をすると、それを取り外すことができなくなってしまうのです。
エアコンが壊れたから違うメーカのエアコンにしよう、
というとき、もともと継承を用いて
『エアコンのある自動車』クラスにコーディングがされていると、
その『ほかのメーカのエアコンのある自動車』も、
そういうクラスにせざるを得ず、実行時にエアコンのメーカーを変えるとき
かなり面倒なことをしなくてはなりません。
さらにクラスの数が容易に爆発します。
コンポジションを使って『エアコンのある自動車』がコーディングされていれば、
『エアコン』クラスを継承した別のメーカーのたとえば『ダイキン製エアコン』を作って、
そのインスタンスを『エアコンのある自動車』に渡してやれば、
きれいにエアコンを取り替えられます。
ここで重要なのは
『エアコン』と『ダイキン製エアコン』には継承が用いられる、
ということでしょうか?
これは純粋に is_a 関係だからです。
そもそも継承というのは・・・
・・・と、話はいくらでも続いていきますが・・・
IIIさん、リンクありがとうございます!
PAIさん、IIIさんのリンクを読んで、私の理解力に問題があってしっくりとこなかったの
ですが、こんなに分かり易く説明して頂いたので非常に助かりました。自分でも少し検索
して探した時に、現実的な具体例があってわかりやすい説明を見つけられなかったので、
ほんと感謝してます。
>『何が違うんじゃボケェ!』という声が聞こえてきそうですが、
いえいえ、めっそうもないです!
解決のチェックを忘れました! すみません。
