繁体   English   中英

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

[英]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");
}

referencecopy对象的类型CMNewsletter或其他类型,而CompareTo的实际实现将驻留在其中。

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

首先,您需要实现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;
    }
}

我将使实现IComparable接口的CMBase抽象类作为抽象方法:

public abstract class CMBase : IComparable
{
    public abstract int CompareTo(object o);
}

这将使所有派生类都实现CompareTo方法。 如果您不能使此类抽象,则可以使实现成为虚假的,只是抛出异常,或者如果可以接受,则实现一些默认的比较逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM