[英]How to implement this particular class hierarchy?
我有一系列从IComparable
接口实现CompareTo
方法的类。
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
的实际实现将驻留在其中。
我不确定如何实现整个类的层次结构来完成我描述的内容。
首先,您需要实现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;
}
}
我将使实现IComparable接口的CMBase抽象类作为抽象方法:
public abstract class CMBase : IComparable
{
public abstract int CompareTo(object o);
}
这将使所有派生类都实现CompareTo方法。 如果您不能使此类抽象,则可以使实现成为虚假的,只是抛出异常,或者如果可以接受,则实现一些默认的比较逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.