1

APIを設計しています。インターフェイスからのメソッドの例を次に示します。

Entry findEntry(int processId);
Entry findEntry(int processId, Filter filter);

ここで、processIdはいくつかの一意の識別情報を指します。しかし、私はまだそのタイプが何であるかを本当に知りprocessIdません。

何かのような要素を抽象化するにはどうすればよいidですか?

私が思いつくことができる最善の方法は、ダミーのインターフェースを作成することです。

Entry findEntry(ProcessId id);
Entry findEntry(ProcessId, Filter filter);

ただし、上記のアプローチでは、APIのクライアントが高すぎる抽象化レベルで動作するように強制される可能性があるのではないかと心配しています。たとえば、プロセスIDの同等性は機能しなくなります(intを使用した場合は機能します)。

明確化:後で、おそらく別のチームによって実装されるインターフェイス(コントラクト)のみを記述していることを明確にできませんでした。そのため、equalsメソッドのような特定のものを強制することはできません。

4

1 に答える 1

6

ジェネリックはここであなたの友達です

必要に応じてメソッド自体について

Entry findEntry<TKey>(TKey processId);

または可能なクラス

public class EntryFinder<TKey>
{
  public Entry findEntry(TKey processId)
  {
     // Implementation
  }
}

編集:インターフェイスを定義している場合は、ここでこれを定義し、インターフェイスの実装者に任せて、エントリの識別に使用するタイプを判断することもできます。

public interface IEntryFinder<TKey>
{
  Entry findEntry(TKey processId);
}

使用法:

// Foo's are looked up by integer
public class FooEntryFinder : IEntryFinder<int>
{
  public Entry findEntry(int processId)
  {
     // Implementation
  }
}
// Baa's are looked up by string
public class BaaEntryFinder : IEntryFinder<string>
{
  public Entry findEntry(string processId)
  {
     // Implementation
  }
}
于 2012-05-28T13:43:08.163 に答える