在 C# 或 Java 中抽象 id 属性

本文关键字:抽象 id 属性 Java | 更新日期: 2023-09-27 18:35:36

我正在设计一个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 - 它会)。

澄清

:我没有澄清我只编写接口(合约),稍后可能由不同的团队实现。这就是为什么我不能强制执行某些东西,如平等方法。

在 C# 或 Java 中抽象 id 属性

泛型是你的朋友

在方法本身上(如果适用)

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
  }
}