Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект ООП прогр.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
1.9 Mб
Скачать

2. Перегрузка операций отношения с помощью метода CompareTo

Используя собственную реализацию метода CompareTo можно перегрузить операции отношения. Напомним, что операции отношения должны перегружаться парами: < и >, <= и >=, == и !=.

Пример:

Для класса DemoPoint перегрузим операции == и != таким образом, чтобы при сравнении двух объектов возвращалось значение true, если точки находятся на равном удалении от начала координат, в противном случае – false.

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); }

public int CompareTo (object obj)

{

DemoPoint b=(DemoPoint) obj;

if (this.Dlina()==b.Dlina())

return 0;

else

if (this.Dlina()>b.Dlina())

return 1;

else

return -1;

}

public static bool operator ==(DemoPoint a, DemoPoint b)

{ return (a.CompareTo(b)==0); }

public static bool operator !=(DemoPoint a, DemoPoint b)

{ return (a.CompareTo(b)!=0); }

}

class Program

{

static void Main()

{

DemoPoint a =new DemoPoint(-3,0);

DemoPoint b=new DemoPoint(0,3);

if (a==b)

Console.WriteLine("равно удалены от начала координат");

else

Console.WriteLine("не равно удалены от начала координат");

}

}

3. Стандартные интерфейсы iEnumerable и iEnumerator

Для циклического обращения к элементам коллекции зачастую проще (да и лучше) организовать цикл foreach, чем пользоваться непосредственно методами интерфейса IEnumerator. Тем не менее ясное представление о принципе действия подобных интерфейсов важно иметь по еще одной причине: если требуется создать класс, содержащий объекты, перечисляемые в цикле foreach, то в этом классе следует реализовать интерфейсы IEnumerator и IEnumerable. Иными словами, для того чтобы обратиться к объекту определяемого пользователем класса в цикле foreach, необходимо реализовать интерфейсы IEnumerator и IEnumerable в их обобщенной или необобщенной форме. Правда, сделать это будет нетрудно, поскольку оба интерфейса не очень велики.

IEnumerator предоставляет возможность выполнить перебор элементов коллекции, предоставлять свойство Current и MoveNext и метод Reset.

Current – получает текущий элемент в коллекции.

MoveNext – перемещает перечислитель к следующему элементу коллекции.

Reset() – устанавливает перечислитель в его начальное положение, т. е. перед первым элементом коллекции.

Пример:

Класс MyInt реализует интерфейсы IEnumerator и IEnumerable.

class MyInt : IEnumerable, IEnumerator

{

int[] ints = { 12, 13, 1, 4 };

int index = -1;

// Реализуем интерейс IEnumerable

public IEnumerator GetEnumerator() { return this; }

// Реализуем интерфейс IEnumerator

public bool MoveNext()

{

if (index == ints.Length - 1)

{

Reset(); return false;

}

index++;

return true;

}

public void Reset()

{ index = -1; }

public object Current

{

get { return ints[index]; }

}

}

class Program

{

static void Main()

{

MyInt mi = new MyInt();

foreach (int i in mi) Console.Write(i+"\t");

Console.ReadLine();

}

}

Контрольные вопросы:

  1. Каким количеством классов может быть реализован интерфейс?

  2. Может ли класс реализовывать множественные интерфейсы?

  3. Необходима ли реализация методов интерфейса в классе, включающем этот интерфейс?

  4. Какой модификатор доступа соответствует интерфейсу?

  5. Допустимо ли явное указание модификатора доступа для интерфейса?