我有一个实现T
的类,其中T
是一个接口。
我意识到我无法对对象执行==
,所以我在代码中使用了Equals()
方法:
return (Equals(_nodes[node.QueueIndex] , node));
但是经过一番谷歌搜索,我还发现IComparable
是一个选项,所以我也可以这样做:
return node.CompareTo(_nodes[node.QueueIndex]) >= 0;
在我的界面上继承并实现了IComparable
:
public int CompareTo(object obj)
{
return obj == this ? 1 : 0;
}
我真的很困惑这里哪种正确的设计方法。它们实际上服务于不同的目的,哪个是正确的选择?
答案 0 :(得分:1)
Equals
(或IEquatable
)用于测试平等。 IComparable
用于测试大于,小于或等于。
在某些情况下,测试相等性是有意义的,但没有直观的比较方法。例如,在国际象棋游戏中的ChessPiece
类。
我认为IComparable
在这里不是一个很好的选择,因为实现CompareTo
的方式很尴尬:
public int CompareTo(object obj)
{
return obj == this ? 1 : 0;
}
您仍然在这里测试是否相等,而没有实际比较对象。如果您可以编写一种不会破坏这些rules的正确CompareTo
方法,那么IComparable
是一个有效的选择。
在链接的这些规则中,您的CompareTo
违反了此规则:
如果
A.CompareTo(B)
返回的值不是零,则B.CompareTo(A)
必须返回相反符号的值。
所以Equals
在这里更合适。
答案 1 :(得分:0)
定义一个通用的特定类型比较方法,该方法将一个值 类型或类实现以排序或排序其实例。
定义值类型或类实现的通用方法 创建用于确定实例是否相等的类型特定方法 。
https://docs.microsoft.com/en-us/dotnet/api/system.icomparable?view=netframework-4.7.2 https://docs.microsoft.com/en-us/dotnet/api/system.iequatable-1?view=netframework-4.7.2
答案 2 :(得分:0)
Comparable通常用于可以订购的东西。
当您要检查是否相等时使用“等于”。
如果您想订购,那么可比较的方法是使用等号接口
但是,如果您要实现可比性,那么请确保equals接口与其保持一致。