俺は十分説明したと思う

オブジェクト指向はCよりも遥かに複雑な依存関係を作り出せるし
テストはしにくいし、よって論理エラーを補足しにくく、結合テストで悲鳴を上げる事になり、
メソッドとデータ・タイプが分離されていないおかげで、クラス構造の設計(という名のお絵かき)は大変になるわ、
デザインパターンとかいう言語仕様の欠陥の見本市に付き合わされるわ
ToStringすらオーバーライドしないと使いものにならないし
オブジェクトを主語としたおかげで汎用性はないし、
クラス・メソッド(関数)は用意されているもののおまけ程度で、関数型には程遠い使い勝手で
単純なことをするには必要以上に複雑で、複雑なことをするにはなおいっそう複雑で
その主張がわかってくれればいいよ
結局Cが抱えていた問題を解決したといって、確かにその問題は解決できたのかもしれないが、
Cよりも規模の大きい、厄介な問題を引き連れていることに気が付かないようではな

>>651
Fighter.Fight(Slime) →たたかう
Fighter.Fight(metalSlime) →聖水

まずこんな動作させたら、このメソッドを使うユーザープログラマが混乱するよね
百歩譲ってそれでいいとしよう、聖水を使うのは、ライブラリプログラマの配慮であり慈悲であると
問題はこれはオブジェクト指向の問題ではないってことだ

この動作をオブジェクト指向で実現するなら、
FighterクラスのFightメソッドの中にif文をずらずらと並べて
if(slime) {"slash"}else if (metalSlime) {"use holywalter"});とするしかない。

でもってmagicianクラスのFightメソッドには
if(slime) {"Fire"} else if (Flame) {"Blizzard"} ...

なぜならばオブジェクト指向言語はマルチメソッドという概念をサポートしていないからだ
キミの指摘はオブジェクト指向がダメな部分を改めてあげつらっているに過ぎない
ちなみに俺ならまずは2次元配列を使ってそれを実装することを考えるけどな