Стандартный интерфейс IComparable
В библиотеке классов .Net определено множество стандартных интерфейсов, задающих желаемую функциональность объектов. Например, интерфейс IComparable задает метод сравнения объектов по принципу больше и меньше, что позволяет переопределить соответствующие операции в рамках класса, наследующего интерфейс IComparable. Реализация интерфейсов IEnumerable и IEnumerator дает возможность просматривать содержимое объекта с помощью оператора foreach.
Можно создавать собственные классы, реализующие стандартные интерфейсы, что позволит использовать объекты этих классов стандартными способами.
Более подробно рассмотрим стандартный интерфейс IComparable.
Интерфейс IComparable определен в пространстве имен System и содержит единственный метод CompareTo, возвращающий результат сравнения двух объектов – текущего и переданного ему в качестве параметра:
interface IComparable
{
int CompareTo(object obj);
}
Реализация данного метода должна возвращать:
0 – если текущий объект и параметр равны;
<0 – если текущий объект меньше параметра;
>0 – положительное число, если текущий объект больше параметра.
Пример:
Рассмотрим реализацию классом DemoPoint стандартного интерфейса IComparable.
// класс DemoPoint реализует стандартный интерфейс IComparable
class DemoPoint:IComparable
{
protected int x;
protected int y;
public DemoPoint ( int x, int y) { this.x=x; this.y=y; }
public void Show()
{ Console.WriteLine("точка на плоскости: ({0}, {1})",x, y); }
public double Dlina() { return Math.Sqrt(x*x+y*y); }
//реализация метода CompareTo
public int CompareTo (object obj)
{
DemoPoint b=(DemoPoint) obj; //преобразуем к типу DemoPoint
//определяем критерии сравнения текущего объекта с параметром в зависимости от удаленности точки от начала координат
if (this.Dlina()==b.Dlina()) return 0;
else if (this.Dlina()>b.Dlina()) return 1;
else return -1;
}
}
class Program
{
static void Main()
{
//создаем массив ссылок
DemoPoint []a =new DemoPoint[4];
a[0]=new DemoPoint(5,-1);
a[1]=new DemoPoint(-3, 3);
a[2]=new DemoPoint(3,4);
a[3]= new DemoPoint(0,1);
//сортируем массив точек, при этом в качестве критерия сортировки будет использоваться собственная реализация метода CompareTo
Array.Sort(a);
Console.WriteLine();
foreach (DemoPoint x in a)
{
x.Show();
Console.WriteLine("Dlina={0:f2} ",x.Dlina());
}
}
}
Обратите внимание на то, что во время реализации метода CompareTo в качестве параметра передавалась ссылка на объект типа object. Напомним, что класс object является корневым классом для всех остальных в С#. Поэтому он может ссылаться на объект любого типа. Но чтобы потом получить доступ к членам объекта произвольного класса, нужно выполнить приведение типов.
Дата добавления: 2015-10-26; просмотров: 980;