可比较的和可比较的
本文关键字:可比较 | 更新日期: 2023-09-27 18:07:23
我应该同时实现IComparable
和通用IComparable<T>
吗?如果我只实现其中一个,会有什么限制吗?
是的,你应该两者都实现。
如果你实现了其中一个,任何依赖于另一个的代码都会失败。
有很多代码使用IComparable
或IComparable<T>
,但不是两者都使用,因此实现两者确保您的代码将与这些代码一起工作。
Oded是正确的,你应该实现这两个,因为有集合和其他类只依赖于一个实现。
但是这里有一个技巧:不应该抛出异常,而IComparable应该抛出异常。在实现icparable
但是,general iccomparable接受System。对象,并且不能保证所有可能的对象都可以与t的实例进行比较。因此,如果将非t实例传递给IComparable,只需抛出System.ArgumentException。否则,将调用路由到iccomparable
示例如下:
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
假设,例如,一个类scheduleevent包含字段scheduletime (DateTime类型)和scheduleaction (MethodInvoker类型)。类包括子类型SchedulerEventWithMessage(它添加了一个string类型的Message字段)和SchedulerEventWithGong(它添加了一个Double类型的GongVolume字段)。SchedulerEvent类具有按scheduletime排序的自然顺序,但是相对于彼此无序的事件完全有可能不相等。SchedulerEventWithMessage和SchedulerEventWithGong类之间也有自然的顺序,但与SchedulerEvent类的项相比就不是这样了。
假设在同一时间安排了两个SchedulerEventWithMessage事件X和Y,但是X. message是"aardvark",Y. message是"zymurgy"。((IComparable