我有一系列从CompareTo
接口实现IComparable
方法的类。
public int CompareTo(CMNewsletter obj)
{
CMNewsletter c = obj;
return String.Compare(c.Name, this.Name);
}
每个类都有自己的CompareTo
实现。因此,应该在每个班级中进行实施。
现在需要在一些基类对象上调用CompareTo。 CMBase
是前面提到的所有类的基类类。
以下代码是我想要设计我的类的方法。
CMBase reference, copy;
if (reference.CompareTo(copy) == 0)
{
Console.WriteLine("Not changed");
}
reference
和copy
个对象的类型为CMNewsletter
或其他类型,CompareTo
的实际实现位于其中。
我不确定如何实现整个类层次结构来完成我所描述的内容。
答案 0 :(得分:1)
首先,您需要实施IEquatable
而不是IComparable
。然后你引入两个辅助方法,即EqualsHelper
和EqualsCore
来完成工作。
EqualsHelper
只是一个辅助方法,用于查找相等是否失败并且EqualsCore
是虚拟的,您需要在所有派生类中重写并在那里实现其相等性。
class MyBase : IEquatable<MyBase>
{
public bool Equals(MyBase other)
{
return EqualsHelper(other);
}
public override bool Equals(object obj)
{
return EqualsHelper(obj as MyBase);
}
protected bool EqualsHelper(MyBase other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
if (other.GetType() != this.GetType()) return false;
return EqualsCore(other);
}
protected virtual bool EqualsCore(MyBase other)
{
return BaseProperty == other.BaseProperty;
}
public override int GetHashCode()
{
return BaseProperty;
}
public int BaseProperty { get; set; }
}
class Derived : MyBase, IEquatable<Derived>
{
public int DerivedProperty { get; set; }
public bool Equals(Derived other)
{
return EqualsHelper(other);
}
protected override bool EqualsCore(MyBase other)
{
Derived obj = (Derived)other;
return base.EqualsCore(obj) &&
this.DerivedProperty == obj.DerivedProperty;
}
}
答案 1 :(得分:-1)
我会将CMBase抽象类实现为IComparable接口作为抽象方法:
public abstract class CMBase : IComparable
{
public abstract int CompareTo(object o);
}
这将使所有派生类实现CompareTo方法。如果你不能使这个类抽象化,那么你可以使实现虚拟只抛出异常,或者如果可以接受 - 实现一些默认的比较逻辑。