如何实现这个特定的类层次结构?

时间:2014-07-22 11:02:06

标签: c# oop

我有一系列从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");
}

referencecopy个对象的类型为CMNewsletter或其他类型,CompareTo的实际实现位于其中。

我不确定如何实现整个类层次结构来完成我所描述的内容。

2 个答案:

答案 0 :(得分:1)

首先,您需要实施IEquatable而不是IComparable。然后你引入两个辅助方法,即EqualsHelperEqualsCore来完成工作。

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方法。如果你不能使这个类抽象化,那么你可以使实现虚拟只抛出异常,或者如果可以接受 - 实现一些默认的比较逻辑。