ポリモーフィズムの概念を使用してクラス階層を作成し、親の参照を使用すると、オブジェクトを持っている特定の型を知らなくてもインターフェイス関数を呼び出します。これは素晴らしい。例:
動物のコレクションがあり、すべての動物の機能を呼び出しeat
ます。犬を食べるのか、猫を食べるのかは気にしません。継承と実装クラス以外から-しかし、同じクラス階層には、追加を持っている動物持ってAnimal
、例えばmakeEggs
、getBackFromTheFreezedState
ようにしています。そのため、関数の一部のケースでは、追加の動作を呼び出す特定のタイプを知りたい場合があります。
たとえば、朝の時間で、動物だけの場合はを呼び出しますeat
。それ以外の場合は、人間の場合は最初washHands
に呼び出し、次に呼び出しgetDressed
ますeat
。この場合の対処方法は?多型が死ぬ。コードの匂いのように聞こえるオブジェクトのタイプを調べる必要があります。このケースを処理する一般的なアプローチはありますか?
Eater
とのインタフェースeat()
方法を、そしてクライアントとして、あなたはそれを気にしないHuman
最初の呼び出しにそれが持っているの実装washHands()
とgetDressed()
、それはこのクラスの実装の詳細です。クライアントとして、あなたがこの事実に関心があるなら、あなたはその仕事に正しいツールを使用していない可能性が高いでしょう。
getDressed
彼らの前に必要になるかもしれないことを考慮する必要がありますがeat
、それは昼食には当てはまりません。状況によっては、washHands();if !dressed then getDressed();[code to actually eat]
これを人間に実装する最良の方法かもしれません。別の可能性は、他のものがそれwashHands
を必要とする場合、および/またはgetDressed
呼び出される場合はどうなりますか?あなたが持っていると仮定しますleaveForWork
か?とにかくずっと前に呼び出されるように、プログラムのフローを構造化する必要があるかもしれません。