2

次のようなタイプが与えられます。

class Thing {
  getInfo();
  isRemoteThing();
  getRemoteLocation();
}

メソッドは、true を返すgetRemoteLocation()場合にのみ定義済みの結果を持ちます。isRemoteThing()ほとんどの s がリモートではないことを考えるとThing、これは受け入れられる API ですか? 私が見るもう1つのオプションは、サブクラスを提供することですが、ユーザーは必要に応じてaをaRemoteThingにキャストする方法が必要です。これは、問題に間接的なレベルを追加するようです.ThingRemoteThing

4

2 に答える 2

1

インターフェイスを実装する一部のオブジェクトで使用できるが、すべてではないオブジェクトで使用できるメンバーをインターフェイスに含めること、およびどのインターフェイス メンバーが役立つかを示すクエリ メソッドを含めることは、それによって何かが得られる場合に適したパターンです。

役立つ理由の例:

  • インターフェイス メンバーが一部のオブジェクトでは有用であるが、同じ type の他のインスタンスでは有用ではない可能性が高い場合、このパターンが理にかなっている唯一のパターンである可能性があります。

  • コンシューマーがインターフェイスを実装するさまざまなオブジェクトへの参照を保持する可能性が高い場合、その一部は特定のメンバーをサポートし、一部はサポートしない場合、およびそのようなコレクションを持つ誰かがそれらのメンバーを使用する可能性が高い場合それをサポートするインスタンスでは、すべてのオブジェクトがメンバーを含むインターフェイスを実装する場合、一部のオブジェクトと一部のオブジェクトが実装しない場合よりも、そのような使用法がより便利になります。これは特にIDisposable.Dispose、関心があるかどうかに関係なく実装に通知することを目的とする (たとえば、誰もそれを必要とせず、それ以上の通知なしに破棄される可能性がある)などのインターフェイス メンバーに当てはまります。結果として (多くの場合何もありません)。やみくもに電話DisposeするIEnumerable<T>IEnumerableの実装がも実装しているかどうかをチェックするよりも高速ですIDisposable。無条件呼び出しは、チェックしてから呼び出すよりも高速であるだけでなくIDisposable、オブジェクトが実装されているかどうかをチェックして実装さIDisposableれていないことを検出するよりも高速です。

  • 場合によっては、コンシューマーがフィールドを使用して、さまざまな種類のものをさまざまなタイミングで保持することがあります。例として、可変オブジェクトへの現存する唯一の参照を保持するフィールドと、不変オブジェクトへの共有参照を保持するフィールドがあると便利な場合があります。フィールドの型に変更メソッド (機能する場合と機能しない場合があります) と、不変インスタンスからコピーされたデータを使用して新しい可変インスタンスを作成する手段が含まれている場合、オブジェクトを受け取り、データを変更する可能性のあるコードは格納できます。渡されたオブジェクトへの参照。データを変更したい場合は、変更可能なコピーへの参照でフィールドを上書きできます。ただし、データを変更する必要がない場合は、渡された不変オブジェクトを使用するだけで、わざわざコピーする必要はありません。

インターフェイスに常に役立つとは限らないメンバーを含めることの最大の欠点は、実装者により多くの作業を課すことです。したがって、インターフェイスを作成する人は、その存在がインターフェイスを実装するほぼすべてのクラスの少なくとも一部の消費者に大きな利益をもたらす可能性のあるメンバーのみを含める必要があります。

于 2013-09-06T20:00:24.147 に答える