IComparableT 作為實現介面的示例

介面看起來很抽象,直到你在實踐中看起來它們。IComparableIComparable<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 會在需要確定放置物件的順序時自動呼叫 ItemCompareTo 方法。此外,除了 List<T> 之外,任何其他需要能夠比較兩個物件的物件都可以工作與 Item 因為我們已經定義了兩種不同的 Items 相互比較的能力。