Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#或Java中抽象id属性_C#_Java - Fatal编程技术网

在C#或Java中抽象id属性

在C#或Java中抽象id属性,c#,java,C#,Java,我正在设计一个API。以下是来自接口的一些示例方法: Entry findEntry(int processId); Entry findEntry(int processId, Filter filter); Entry findEntry(ProcessId id); Entry findEntry(ProcessId, Filter filter); 其中,processId指的是一些唯一的标识信息。然而,我还不知道processId的类型是什么 我怎样才能抽象出像某物的id这样的元素

我正在设计一个API。以下是来自接口的一些示例方法:

Entry findEntry(int processId);
Entry findEntry(int processId, Filter filter);
Entry findEntry(ProcessId id);
Entry findEntry(ProcessId, Filter filter);
其中,
processId
指的是一些唯一的标识信息。然而,我还不知道processId的类型是什么

我怎样才能抽象出像某物的
id
这样的元素

我能想到的最好办法是创建一个虚拟接口:

Entry findEntry(int processId);
Entry findEntry(int processId, Filter filter);
Entry findEntry(ProcessId id);
Entry findEntry(ProcessId, Filter filter);
然而,我担心使用上述方法可能会迫使API的客户端在过高的抽象级别上操作。例如,进程id的相等性将不再起作用(而如果它们使用int,则会起作用)


澄清:我没有澄清我只是在编写接口(合同),稍后可能由另一个团队实施。这就是为什么我不能强制执行某些东西,比如equals方法。

泛型是您的朋友

如果合适的话,在方法本身上

Entry findEntry<TKey>(TKey processId);
Entry findEntry(TKey processId);
或者可能是在课堂上

public class EntryFinder<TKey>
{
  public Entry findEntry(TKey processId)
  {
     // Implementation
  }
}
公共类入口查找器
{
公共条目findEntry(TKey processId)
{
//实施
}
}
编辑:如果要定义接口,也可以在此处定义该接口,并将其留给接口的执行者,以确定他们想要使用什么类型来标识条目

public interface IEntryFinder<TKey>
{
  Entry findEntry(TKey processId);
}
公共接口IEntryFinder
{
输入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
  }
}
//按整数查找Foo
公共类FooEntryFinder:IEntryFinder
{
公共条目findEntry(int processId)
{
//实施
}
}
//Baa通过字符串查找
公共类BaEntryFinder:IEntryFinder
{
公共条目findEntry(字符串processId)
{
//实施
}
}

泛型是您的朋友

如果合适的话,在方法本身上

Entry findEntry<TKey>(TKey processId);
Entry findEntry(TKey processId);
或者可能是在课堂上

public class EntryFinder<TKey>
{
  public Entry findEntry(TKey processId)
  {
     // Implementation
  }
}
公共类入口查找器
{
公共条目findEntry(TKey processId)
{
//实施
}
}
编辑:如果要定义接口,也可以在此处定义该接口,并将其留给接口的执行者,以确定他们想要使用什么类型来标识条目

public interface IEntryFinder<TKey>
{
  Entry findEntry(TKey processId);
}
公共接口IEntryFinder
{
输入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
  }
}
//按整数查找Foo
公共类FooEntryFinder:IEntryFinder
{
公共条目findEntry(int processId)
{
//实施
}
}
//Baa通过字符串查找
公共类BaEntryFinder:IEntryFinder
{
公共条目findEntry(字符串processId)
{
//实施
}
}


您希望如何在C#和Java中实现这一点?我认为进程ID可以是字符串或int。查看您的接口,它将不再是复杂的类型
。例如,进程ID的相等性将不再有效
定义比较方法?相等性由Java中类的
equals()
方法确定,如果要测试是否相等,则可以覆盖该属性。在C#中,我不知道这是如何工作的,但可能非常类似。如果你把问题缩小到一种语言,那会有帮助的。谢谢@biziclop,但我用多种语言提出这个问题,以避免非常特定于语言的答案。在我看来,这更多的是一个理论问题,解决方案应该适用于大多数静态类型的语言。您希望在C#和Java中如何工作?我认为进程ID可能是字符串或int。看看您的接口,它不会是一个复杂的类型
,进程id的相等性将不再有效
定义比较方法?相等性由Java中类的
equals()
方法确定,如果要测试相等性,可以重写该方法。在C#中,我不知道这是如何工作的,但可能非常类似。如果你把问题缩小到一种语言,那会有帮助的。谢谢@biziclop,但我用多种语言提出这个问题,以避免非常特定于语言的答案。在我看来,这更多的是一个理论问题,解决方案应该适用于大多数静态类型语言。为什么要使用泛型而不是继承?似乎完全没有理由或理由这样做。@biziclop-我说过这是唯一的解决办法吗?请随意发布另一个答案和另一个解决方案。它看起来太复杂和不必要了。@biziclop-WTF?!通过定义一个泛型类型并使用它指定“查找条目时要使用的键类型(TKey)”,会使什么变得过于复杂它在Java中也没有那么复杂,在Hibernate中使用得相当多-查找GenericDaoHibernate以查找需要通过字符串或长实体标识符加载的示例。为什么要使用泛型而不是继承?似乎完全没有理由或理由这样做。@biziclop-我说过这是唯一的解决办法吗?请随意发布另一个答案和另一个解决方案。它看起来太复杂和不必要了。@biziclop-WTF?!通过定义一个泛型类型并使用它来指定“查找条目时要使用的密钥类型(TKey)”,它变得过于复杂。它在Java中也没有那么复杂,在Hibernate中使用得相当多-查找GenericDaoHibernate以查找需要通过字符串或长实体标识符加载的示例等。