我正在设计一个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方法。
答案 0 :(得分:6)
泛型是你的朋友
如果合适,关于方法本身
Entry findEntry<TKey>(TKey processId);
或可能是班级
public class EntryFinder<TKey>
{
public Entry findEntry(TKey processId)
{
// Implementation
}
}
编辑:如果您正在定义界面,您也可以在那里定义它并将其留给界面的实现者,以确定他们想要用什么类型来识别一个Entry。 / p>
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
}
}