假设我有以下课程:
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类。
通过这种方式,我可以查找价值并将责任保留在需要的地方。
答案 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>
时,您应该覆盖Equals
和GetHashCode
。
反过来意味着你应该覆盖所有的比较运算符:
==
(暗示!=
)<
和<=
>
和>=
答案 1 :(得分:0)
除非为类实现全新的集合类型或使用某种扩展方法,否则无法使用contains方法将集合中的对象与不同类型的对象进行比较!!!