【发布时间】:2019-01-03 05:01:54
【问题描述】:
这更像是一项学术练习,所以我基本上只是想弄清楚当类型不同时如何使用 IComparable。
假设我们有一个水果类,以及派生类“Apple”和“Orange”。假设我想要一个水果列表,让所有的苹果都排在橘子之前。解决这个问题的最佳方法是什么?
我认为你可以让 Fruit 实现接口 IComparable 并为非常子类型放入一堆条件语句,但这对我来说似乎很粗糙并且可能违反了开放/封闭原则。我更感兴趣的是让它以这种方式工作:
public abstract class Fruit : IComparable<Fruit>
{
public abstract int CompareTo(Fruit other);
}
public class Apple : Fruit, IComparable<Orange>
{
public override int CompareTo(Fruit other)
{
if(other is Orange)
{
this.CompareTo((Orange)other);
}
return 0;
}
public virtual int CompareTo(Orange other)
{
return -1;
}
}
public class Orange : Fruit, IComparable<Apple>
{
public override int CompareTo(Fruit other)
{
if (other is Apple)
{
this.CompareTo((Apple)other);
}
return 0;
}
public virtual int CompareTo(Apple other)
{
return 1;
}
}
我的主要目标是让 IComparable 与跨类型一起工作。我尝试用各种水果加载一个列表,但可惜它没有排序。也许我对 CompareTo 的返回值的理解有点不靠谱。这种方法有什么希望吗?有没有比显而易见的方法更有用的场景?
【问题讨论】:
-
有没有一种情况,你会看到橙色等于苹果?如果是这样,您将需要 IComparable。如果它们永远不会被认为是相等的,那么简单的类型比较就足够了。
-
如果你也有香蕉怎么办?那些总是更大的苹果但更小的橙子吗?要么 ...?话虽如此,您的 学术问题 毫无意义,因为您不能假设您的基类只有两个祖先。事实上,基类甚至不应该知道它的祖先的任何事情。
-
如果目标只是对对象数组进行排序,请考虑使用
IEnumerable<T>.OrderByDescending,如var sortedFruits = fruits.OrderByDescending(x => x is Apple); -
冲突的 CompareTo() 实现。 Apple.CompareTo 说苹果总是小于橙子。 Orange.CompareTo 表示橙子总是小于苹果。使用返回 1;在其中一个中再试一次。
标签: c# generics icomparable