Looking for c# Keywords? Try Ask4Keywords

C# Language IComparable как пример реализации интерфейса


пример

Интерфейсы могут казаться абстрактными, пока вы не увидите их на практике. IComparable и IComparable<T> - отличные примеры того, почему интерфейсы могут быть полезны для нас.

Предположим, что в программе для интернет-магазина у нас есть множество предметов, которые вы можете купить. Каждый элемент имеет имя, идентификационный номер и цену.

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-номеру от наименьшего до самого большого. Вместо написания нашего собственного алгоритма сортировки мы можем вместо этого использовать метод Sort() который уже имеет List<T> . Однако, поскольку наш класс Item находится прямо сейчас, для List<T> нет способа понять, какой порядок сортировать список. Здесь находится интерфейс IComparable .

Чтобы правильно реализовать метод CompareTo , CompareTo должен возвращать положительное число, если параметр «меньше» текущего, ноль, если они равны, и отрицательное число, если параметр «больше».

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 в нашем элементе просто возвращает разницу в их идентификационных номерах, но что делает это на практике?

Теперь, когда мы вызываем Sort() в объекте List<Item> , List будет автоматически вызывать метод CompareTo Item когда ему нужно определить, в какой порядок помещать объекты. Кроме того, помимо List<T> , любые другие объекты которые нуждаются в способности сравнивать два объекта, будут работать с Item потому что мы определили способность двух разных Item s сравнивать друг с другом.