IComparableT 作为实现接口的示例
接口看起来很抽象,直到你在实践中看起来它们。IComparable
和 IComparable<T>
是界面为什么对我们有所帮助的很好的例子。
假设在一个在线商店的程序中,我们有各种各样的商品你可以买。每个项目都有一个名称,一个 ID 号和一个价格。
public class Item {
public string name; // though public variables are generally bad practice,
public int idNumber; // to keep this example simple we will use them instead
public decimal price; // of a property.
// body omitted for brevity
}
我们将 Item
存储在 List<Item>
中,在我们的程序中,我们希望按 ID 编号从最小到最大排序。我们可以改为使用 List<T>
已经拥有的 Sort()
方法,而不是编写我们自己的排序算法。但是,由于我们的 Item
类现在正在使用,因此 List<T>
无法理解对列表进行排序的顺序。这是 IComparable
接口的用武之地。
为了正确实现 CompareTo
方法,如果参数小于当前值,则 CompareTo
应返回正数,如果相等则为 0,如果参数大于,则返回负数。
Item apple = new Item();
apple.idNumber = 15;
Item banana = new Item();
banana.idNumber = 4;
Item cow = new Item();
cow.idNumber = 15;
Item diamond = new Item();
diamond.idNumber = 18;
Console.WriteLine(apple.CompareTo(banana)); // 11
Console.WriteLine(apple.CompareTo(cow)); // 0
Console.WriteLine(apple.CompareTo(diamond)); // -3
这是示例 Item
的接口实现:
public class Item : IComparable<Item> {
private string name;
private int idNumber;
private decimal price;
public int CompareTo(Item otherItem) {
return (this.idNumber - otherItem.idNumber);
}
// rest of code omitted for brevity
}
在表面层面上,我们项目中的 CompareTo
方法只返回其 ID 号的差异,但上述内容在实践中做了什么?
现在,当我们在 List<Item>
对象上调用 Sort()
时,List
会在需要确定放置对象的顺序时自动调用 Item
的 CompareTo
方法。此外,除了 List<T>
之外,任何其他需要能够比较两个对象的对象都可以工作与 Item
因为我们已经定义了两种不同的 Item
s 相互比较的能力。