>>829-830
つまり、FooをHogeの内部に保持すべきでない理由は:
1. Fooに対して操作が行われることが、Hogeを利用する側から不可視になるから
2. Hogeに渡されたFooが、他の場所で破壊的に操作される恐れがあるから
ということでいいのかな(次からは論点を箇条書きでまとめてほしいな)。

まず、2については、new Hoge(foo)でもhoge.method(foo)でも問題は変わらないよね。
Fooの設計、もしくはFooインスタンスを生成して利用する側のインスタンス管理の問題であって、
コンポジションに限った話ではない。

1については、ファイル出力でよく使う以下のパターンを見れば十分なんじゃないかな。

 OutputStream out =
   new BufferedOutputStream(new FileOutputStream(new File("hoge.txt")));
 ・・・
 out.write(data); // データを出力したい。具体的な出力先と出力方法は知らなくとも良い

典型的なDecoratorパターンだけど、実際にoutを使う側からすれば、
ここで重要なのは「データを出力すること」であって、具体的な出力先(File)や、
出力方法(FileOutputStream/BufferedOutputStream)や、現在の書き込み位置ではないわけだ。
つまり、委譲を使う方法の方が、「データを出力する」という操作をより簡潔かつ明瞭に記述できる。

また、具体的な出力方法を知る必要があるなら、outを初期化している部分を調べればいい。
これは、FILE *fp = fopen("hoge.txt", "wb");と何ら変わらない。