可修改的IC Comparable实现?

时间:2012-08-04 03:11:34

标签: c# override compareto icomparable

如果我理解正确,IComparableIComparable<T>旨在允许定义一组类型的自然或总排序。在任何一种情况下,CompareTo(Object)CompareTo(T)定义的关系必须为自反对称传递。< / p>

当应用于单个类型甚至整个类型的层次结构时,这非常好并且非常适用(假设那些更多派生类型不需要影响关系的定义)。但是,一旦一个子类型引入了一个状态元素,该元素应该根据它所衍生的那些类型影响它的关系,那么可比较的接口几乎就会崩溃。

提供的代码示例演示了我当前解决问题的方法。因为RelationalObject无法了解实际需要比较的那些类型,其预期目的主要是提供和密封CompareTo的可修改实现,同时要求派生类型实际实现基于的比较算法上下文。

我想知道,有没有更好的方法来处理这种情况?我意识到我可能只是实现一些知道并可以处理已知对象比较的IComparerIComparer<T>;但是,这似乎违背了IComparableIComparable<T>的目的。

using System;

public abstract class RelationalObject : IComparable<RelationalObject>
{
    public sealed int CompareTo(RelationalObject that)
    {
        int relation = 0;

        if (that == null)
            relation = 1;

        if (relation == 0 && !this.Equals(that))
        {
            Type thisType = this.GetType();
            Type thatType = that.GetType();

            if (thatType.IsInstanceOfType(this))
            {
                if (thisType.Equals(thatType))
                    relation = this.CompareToExactType(that);
                else
                    relation = -1 * that.CompareToSuperType(this);
            }
            else
            {
                if (thisType.IsInstanceOfType(that))
                    relation = this.CompareToSuperType(that);
                else
                    relation = this.CompareToForeignType(that);
            }
        }

        return relation;
    }

    protected abstract int CompareToExactType(RelationalObject that);

    protected abstract int CompareToForeignType(RelationalObject that);

    protected abstract int CompareToSuperType(RelationalObject that);
}

1 个答案:

答案 0 :(得分:1)

IComparable<T>主要用于比较 one 类型的对象,而不是类型及其后代。这就是为什么你在处理未知类型的比较时遇到问题。所以我坚持实施IComparer