ここでは全動物に共通するもの。その他に,各動物に固有の属性(例えば,蛇だったら『ねじる』みたいな)も,それぞれ追加した。具体的な動物を定義したので,具体的な餌も定義してみる。動物と餌が定義できて,ようやく準備完了だ。実際に食べさせるためのコードを実装することを考えてみよう。猫にバナナを与えたら,どうなるのか,記述してみよう。書けば良さそうである。続いて,犬はどうだ猿はどうだと考えると,けっこう面倒くさいことに気付く。記述しなければならないからだ。通常,各クラスは別々のファイルに定義されているから,バナナを食べさせるために,全部の動物のコードを変更しなければならないのだ。新しい食べ物を追加するたびに,全ての動物のコードを変更しなければならない。これは単に面倒くさいから嫌だという理由だけでなくて,各動物のコードを完成させるのに,バナナという餌を知らなければならないという重大な問題がある。これがなんで問題かというと,この動物たちの仮想世界に新しい餌を登場させようと思ったとき,全部の動物たちを,修正しなければならないからである。動物の実装が全ての餌に依存してしまうという問題がある。ここまで書いて疲れたので,残りの取りあえずコードを引用してから説明することにする。さっきの実装では何もしなかった餌に,少し働いてもらうことにする。0;};先ほどの設計では,動物に餌のことを,全てを教えなければならなかったために,保守が面倒なことになった。使う実装では,先ほど何もしなかった餌クラスに,世の中にどんな動物がいるのか,その名前だけを教えてやる。正確にいうと,餌はそれが動物かどうかも知らない。この世の中には猫,犬,猿,蛇なるものがいて,それに食べられることだけを知っているだけである。これにともない,食べる側のコードをも以下のように変更する。使うときは,「俺が餌を食べるってことは,餌が俺に食べられるなんだな」ということしか知らない。動物たちは,その餌を食べると自分がどうなるのか分からないのはちょっと間抜けな話だが,それはこの例え話が悪いせいである。そのかわり,バナナが全てを知っている。)を持っているかを知っている。食べられると具体的にどうなるのかを,ここ記述する。全部をつなげた完全なコードは以下の通り。0;}たとえ話はそろそろやめにしよう。