【问题标题】:A Modifiable IComparable Implementation?可修改的 IComparable 实现?
【发布时间】:2012-08-04 14:38:35
【问题描述】:

如果我理解正确,IComparableIComparable<T> 旨在允许定义一组类型的自然排序或全排序。无论哪种情况,CompareTo(Object)CompareTo(T) 定义的关系都必须是ReflexiveSymmetricTransitive

当应用于单个类型甚至整个类型层次结构时,这一切都非常好,非常适用(假设那些更多派生的类型不需要影响关系的定义)。然而,一旦一个子类型引入了一个状态元素,该元素应该会影响它与其派生的那些类型之间的关系,那么可比较的接口似乎就会崩溃。

提供的代码示例演示了我当前对该问题的解决方案。因为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);
}

【问题讨论】:

  • 我认为这将是 Code Review 网站的不错候选者。

标签: c# overriding compareto icomparable


【解决方案1】:

IComparable&lt;T&gt; 主要用于比较 one 类型的对象,而不是类型及其后代。这就是为什么您在处理未知类型的比较时遇到问题的原因。所以我会坚持实现IComparer

【讨论】:

  • 自从您的答案发布以来,我已经对该主题进行了更多思考,并假设暂时分别实施 IComparer 和 IComparer 将导致更有效的解决方案。出于这个原因,我接受这个答案。但是,我不禁想知道某些解决方案是否可以通过类似于所提议的模式来更好地描述。无论如何,感谢您的反馈!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多