C# Language IComparable comme exemple d'implémentation d'une interface


Exemple

Les interfaces peuvent sembler abstraites jusqu'à ce que vous les apparaissiez en pratique. IComparable et IComparable<T> sont d'excellents exemples de la raison pour laquelle les interfaces peuvent nous être utiles.

Disons que dans un programme pour une boutique en ligne, nous avons une variété d'articles que vous pouvez acheter. Chaque article a un nom, un numéro d'identification et un prix.

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        

}

Nous avons nos Item stockés dans une List<Item> , et dans notre programme quelque part, nous voulons trier notre liste par numéro d'identification du plus petit au plus grand. Au lieu d'écrire notre propre algorithme de tri, nous pouvons utiliser la méthode Sort() que List<T> déjà. Cependant, comme notre classe Item est en ce moment, la List<T> pas de comprendre l'ordre de tri de la liste. Voici où l'interface IComparable entre en jeu.

Pour implémenter correctement la méthode CompareTo , CompareTo doit renvoyer un nombre positif si le paramètre est "inférieur à" l'actuel, zéro s'il est égal et un nombre négatif si le paramètre est "supérieur à".

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

Voici l'exemple Item de mise en œuvre de l'interface »:

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    

}

Au niveau de la surface, la méthode CompareTo de notre article renvoie simplement la différence entre leurs numéros d’identification, mais que fait-il dans la pratique?

Maintenant, quand nous appelons Sort() sur une List<Item> objet, la List appellera automatiquement le Item de CompareTo méthode quand il a besoin de déterminer quel ordre de mettre des objets. De plus, en plus de la List<T> , tout autre objet ceux qui ont besoin de la possibilité de comparer deux objets fonctionneront avec l' Item car nous avons défini la possibilité de comparer deux Item différents les uns avec les autres.