2

假设我有以下课程:

public sealed class ScaleValue : 
    IComparable, IComparable<ScaleValue>, IEquatable<ScaleValue>
{
    public double Value
    { get; set;}
    public string Definition
    { get; set;}

    // interface methods
    ...
}

如果我想让我的课程与 a 相媲美,我double应该以这种方式包含IComparable<double>并实现它,还是必须以另一种方式进行?

当我希望我的班级与双打相当时,应该double.CompareTo给出与ScaleValue.CompareTo

怎么样Equals

我认为我在设计中把责任放在了错误的地方。我认为我最好的选择是使用ContainsValue(double Value)方法制作 Scale 类。通过这种方式,我可以查找价值并将责任保留在需要的地方。

4

2 回答 2

0

你的班级与什么相媲美取决于你。你可以让它与任何东西相媲美,因为IComparable接口的非通用版本需要一个object; 在CompareTomethod的实现中,基本上可以嗅探对象的类型(除非是null)。

当您使用 的通用版本时IComparable<T>,您正在声明您对任何类型参数T都实现了强类型比较方法。

一般来说,如果你有IComparable<T>一个类型的实现,你可能也应该有一个IEquatable<T>实现。

拥有IComparable/IComparable<T>实现意味着结构所表示的内容具有自然的顺序。排序还意味着两个实例之间可以相等:如果实例aT大于或小于实例bT则它必须相等。

为此,如果您实施IComparable/IComparable<T>,那么逻辑要求您实施IEquatable/IEquatable<T>

当然,当你实现时IEquatable/IEquatable<T>,你应该覆盖EqualsGetHashCode

这反过来意味着您应该覆盖所有比较运算符:

  • ==(这意味着!=
  • <<=
  • >>=
于 2013-10-06T13:39:53.960 回答
0

您不能使用 contains 方法将集合中的对象与不同类型的对象进行比较,除非您为您的类实现全新的集合类型或使用某种扩展方法!!!

于 2013-10-07T17:51:59.910 回答