1

私は以下を達成するための最良の方法を探しています:

バックグラウンド

request()異なるサブクラスを持つ仮想メソッドを持つベースクラスがあり、リクエストを実行するための代替実装を提供します。request()クライアントがこれらのサブクラスの1つをインスタンス化し、これらのオブジェクトの1つをサブシステムに渡して、必要なときに呼び出すようにするという考え方です。目標は、目的のサブクラスをインスタンス化することによって要求を処理する方法をクライアントに決定させることです。

問題

ただし、特定のサブクラス実装が選択された場合、それはサブシステムからの情報を必要とします。これは、最も自然に要求への引数として渡されます(つまりrequest(special_info);)。しかし、他のサブクラスはこれを必要としません。この違いや、ここで使用できる適切なデザインパターンを隠すためのクリーンな方法はありますか?

ありがとう

4

2 に答える 2

0

JB Nizet の提案は、可能な解決策の 1 つです。それは確かに機能します。

私が少し心配しているのは、「もっと情報が必要な人もいる」という漠然とした考えです。この情報はどこから来て、何がそれを決定しますか? 継承の一般的な原則は、すべてのオブジェクトに対して正しいことを行う基本クラスがあるということです。「タイプ A オブジェクトかタイプ B オブジェクトかの場合はこれを行い、タイプ C オブジェクトの場合は少し異なることを行い、タイプ D オブジェクトの場合は別の種類のことを行います」と言わなければならない場合は、次のようにします。間違っています。

JBの提案はあなたにとって正しいものかもしれませんが、「special_info」をコンストラクターに渡すか、ヘルパー関数を介してフェッチするオプションも検討します. コンストラクター ソリューションは適切なものです。構築時に、明らかに、何かが作成している A、B、C、または D オブジェクトであるかどうかを知る必要があるからです。ヘルパー関数は、場合によっては優れたソリューションですが、使い方を誤ると、ややこしいソリューションになる可能性があるため、注意して使用してください。

一般に、このような結果になるのは、クラスを「間違った方法で」分割しているからです。

于 2012-12-26T21:21:13.527 に答える