Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

4. Выполнение операций со встроенными в с# типами данных

Для любого заданного класса и оператора имеется также возможность перегрузить сам операторный метод. Это, в частности, требуется для того, чтобы разрешить операции с типом класса и другими типами данных, в том числе и встроенными. Давайте добавим следующую перегрузку в предыдущий пример:

public static string operator +(MyArr obj1, string s)

{

Console.WriteLine(s + " " + obj1.x + " " + obj1.y + " " + obj1.z);

return s;

}

//...

string s = Point2 + "Координаты точки Point2:";

//...

Рис. 3. 1. Результат работы кода выше

Как подтверждает приведённый выше результат, когда оператор «+» применяется к двум объектам класса MyArr, то складываются их координаты. А когда он применяется к объекту типа MyArr и строковому значению, то возвращается строка с текущими координатами объекта.

4.2.5. Перегрузка операторов отношения и операторов «true» и «false» Перегрузка операторов отношения и операторов «true» и «false»

1. Перегрузка операторов отношения

Операторы отношения, например «==» и «<», могут также перегружаться, причем очень просто. Как правило, перегруженный оператор отношения возвращает логическое значение true и false. Это вполне соответствует правилам обычного применения подобных операторов и дает возможность использовать их перегружаемые разновидности в условных выражениях. Если же возвращается результат другого типа, то тем самым сильно ограничивается применимость операторов отношения.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

class MyArr

{

// Координаты точки в трехмерном пространстве

public int x, y, z;

public MyArr(int x = 0, int y = 0, int z = 0)

{

this.x = x;

this.y = y;

this.z = z;

}

// Перегружаем логический оператор ==

public static bool operator ==(MyArr obj1, MyArr obj2)

{

if ((obj1.x == obj2.x) && (obj1.y == obj2.y) && (obj1.z == obj2.z))

return true;

return false;

}

// Теперь обязательно нужно перегрузить логический оператор !=

public static bool operator !=(MyArr obj1, MyArr obj2)

{

if ((obj1.x != obj2.x) || (obj1.y != obj2.y) || (obj1.z != obj2.z))

return false;

return true;

}

}

class Program

{

static void Main(string[] args)

{

MyArr myObject1 = new MyArr(x: 4, z: 5, y: 12);

MyArr myObject2 = new MyArr(x: 4, z: 5, y: 12);

if (myObject1 == myObject2)

Console.WriteLine("Объекты равны.");

Console.WriteLine("Для продолжения нажмите любую клавишу . . .");

Console.ReadKey();

}

}

}

/* Выведет:

* Объекты равны.

* Для продолжения нажмите любую клавишу . . .

*/

Обратим внимание, что на перегрузку операторов отношения накладывается следующее важное ограничение: они должны перегружаться попарно. Так, если перегружается оператор «<», то следует перегрузить и оператор «>», и наоборот. Ниже приведены составленные в пары перегружаемые операторы отношения:

!= ==

< >

<= >=

И ещё одно замечание: если перегружаются операторы «==» и «!=», то для этого обычно требуется также переопределить методы Object.Equals и Object.GetHashCode.