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 相互比較的能力。