【发布时间】:2015-07-21 21:06:52
【问题描述】:
我应该同时实现IComparable 和通用IComparable<T> 吗?如果我只实现其中一个,是否有任何限制?
【问题讨论】:
-
你只需要为
IComparable<T>编写代码。通过将实际比较委托给通用实现,您可以免费获得IComparable。
标签: c# .net icomparable
我应该同时实现IComparable 和通用IComparable<T> 吗?如果我只实现其中一个,是否有任何限制?
【问题讨论】:
IComparable<T>编写代码。通过将实际比较委托给通用实现,您可以免费获得 IComparable。
标签: c# .net icomparable
是的,你应该同时实现。
如果您实现一个,任何依赖于另一个的代码都会失败。
有很多代码使用IComparable 或IComparable<T>,但不能同时使用两者,因此实现两者可确保您的代码可以与此类代码一起使用。
【讨论】:
IComparable 肯定被某些框架代码使用。我相信Array.Sort 和ArrayList.Sort 使用它。
Oded 是正确的,您应该同时实现这两者,因为有集合和其他类仅依赖于其中一种实现。
但是有一个技巧:IComparable
但是,一般 IComparable 接受 System.Object,您不能保证所有可想象的对象都可以与 T 的实例进行比较。因此,如果您将非 T 实例传递给 IComparable,只需抛出 System.ArgumentException。否则,将调用路由到 IComparable
示例如下:
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 时应注意的副作用的广泛分析
【讨论】:
虽然 IEquatable
例如,假设有一个类 SchedulerEvent,其中包含字段 ScheduledTime(DateTime 类型)和 ScheduledAction(MethodInvoker 类型)。该类包括子类型 SchedulerEventWithMessage(它添加了一个字符串类型的 Message 字段)和 SchedulerEventWithGong(它添加了一个 Double 类型的 GongVolume 字段)。 SchedulerEvent 类具有按 ScheduledTime 的自然排序,但是相对于彼此无序的事件完全有可能不相等。 SchedulerEventWithMessage 和 SchedulerEventWithGong 类之间也有自然的顺序,但与 SchedulerEvent 类的项目相比则没有。
假设一个有两个SchedulerEventWithMessage事件X和Y同时调度,但是X.Message是“aardvark”,Y.Message是“zymurgy”。 ((IComparable
顺便说一句,有人可能会争辩说,让 IEquatable
【讨论】: