[747] Re:分析と設計
投稿者:CES
2007/02/20 02:13:25
概ね、皆さんに同意ですね。
>struct bird { virtual void fly()=0; };
このクラス設計が意味するところは簡単で「鳥は飛べる」ただこれだけです。
論理学風の言い方をすれば「鳥ならば飛べる」。
>Q1.案件B(あるいはA’と言い換えても)では「こうもり」を扱う必要が生じた。
>基底クラスを書き換える/書き換えない?派生クラスの実装をどうする?
「飛べるならば鳥である」ではありませんから、コウモリを鳥のサブクラスにすることはできません。
どうしても統一的に扱いたいのならば、Flying-Animal クラスでも導入すべきです。
>Q2.案件C(あるいはA”)では「ダチョウ」「ペンギン」を扱う必要が生じた。
>基底クラスを書き換える/書き換えない?派生クラスの実装をどうする?
これは、前提条件が崩れているわけですから、理想的には一からやり直すべきです。
鳥クラスの下に「飛べる鳥」クラスと「飛べない鳥」クラスを設けて、fly メソッドは飛べる鳥クラスに移動する…と、既存の bird.fly メソッドを使っているコードは動かなくなりますね。
コスト的にやり直しが許されないのならば、飛べない鳥クラスの fly メソッドは、何もしない空実装にするのも手かもしれません。