我应该同时实现IComparable
和通用的IComparable<T>
吗?如果我只实现其中一个是否有任何限制?
我应该同时实现IComparable
和通用的IComparable<T>
吗?如果我只实现其中一个是否有任何限制?
是的,你需要同时实现两者。
如果只实现其中一个,那些依赖于另一个接口的代码将会失效。
很多代码仅使用 IComparable
或 IComparable<T>
其中之一,而实现两者可以确保你的代码能够与这些代码正常工作。
Array.Sort
和 ArrayList.Sort
使用了它。 - OdedOded是正确的,你应该同时实现两个接口,因为有一些集合和其他类只依赖其中一个实现。
但是这里有一个诀窍:IComparable<T>不应该抛出异常,而IComparable应该。当实现IComparable<T>时,你需要确保所有T的实例都可以相互比较。这包括null(将null视为小于所有非null的T实例即可)。
然而,通用的IComparable接受System.Object类型,你无法保证所有可能的对象都可以与T的实例进行比较。因此,如果传递给IComparable的是非T实例,只需抛出System.ArgumentException异常。否则,将调用路由到IComparable<T>实现。
以下是示例:
public class Piano : IComparable<Piano>, IComparable
{
public int CompareTo(Piano other) { ... }
...
public int CompareTo(object obj)
{
if (obj != null && !(obj is Piano))
throw new ArgumentException("Object must be of type Piano.");
return CompareTo(obj as Piano);
}
}
这个例子是一个更长文章的一部分,该文章包含了大量关于实现IComparable<T>时需要注意的副作用的分析:如何在基类和派生类中实现IComparable<T>接口
IComparable<T>
的代码。通过将实际比较委托给通用实现,你可以免费获得IComparable
。 - Jeff Mercado