如何在C#中实现多类型IComparable / IEquatable

时间:2013-10-06 13:27:47

标签: c# .net icomparable iequatable

假设我有以下课程:

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

    // interface methods
    ...
}

如果我想让我的课程与double相媲美,我应该只包含IComparable<double>并以此方式实施,还是必须采用其他方式?

当我希望我的课程与双打相比时,double.CompareTo会给出与ScaleValue.CompareTo相同的结果吗?

以及Equals怎么样?

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

2 个答案:

答案 0 :(得分:0)

你的课程可以与你相提并论。您可以将其与任何进行比较,因为IComparable interface的非通用版本需要object;在CompareTo method的实现中,你基本上可以嗅探对象的类型(除非它是null)。

当您使用IComparable<T>的通用版本时,您将声明为类型参数T实现强类型比较方法。

通常,如果您对一种类型实施IComparable<T>实施,那么可能也应该有IEquatable<T>实施。

实现IComparable/IComparable<T>意味着结构所代表的内容具有自然的顺序。排序还意味着两个实例之间可以相等:如果a的实例T不大于或小于b的实例T那么必须是平等的。

为此,如果您实施IComparable/IComparable<T>,则逻辑会指示您实施IEquatable/IEquatable<T>

当然,当您实施IEquatable/IEquatable<T>时,您应该覆盖EqualsGetHashCode

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

  • ==(暗示!=
  • <<=
  • >>=

答案 1 :(得分:0)

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