Interfaces can seem abstract until you seem them in practice. The IComparable
and IComparable<T>
are great examples of why interfaces can be helpful to us.
Let's say that in a program for a online store, we have a variety of items you can buy. Each item has a name, an ID number, and a price.
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
}
We have our Item
s stored inside of a List<Item>
, and in our program somewhere, we want to sort our list by ID number from smallest to largest. Instead of writing our own sorting algorithm, we can instead use the Sort()
method that List<T>
already has. However, as our Item
class is right now, there is no way for the List<T>
to understand what order to sort the list. Here is where the IComparable
interface comes in.
To correctly implement the CompareTo
method, CompareTo
should return a positive number if the parameter is "less than" the current one, zero if they are equal, and a negative number if the parameter is "greater than".
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
Here's the example Item
's implementation of the 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
}
On a surface level, the CompareTo
method in our item simply returns the difference in their ID numbers, but what does the above do in practice?
Now, when we call Sort()
on a List<Item>
object, the List
will automatically call the Item
's CompareTo
method when it needs to determine what order to put objects in. Furthermore, besides List<T>
, any other objects that need the ability to compare two objects will work with the Item
because we have defined the ability for two different Item
s to be compared with one another.