Перегрузка унарных операторов в C#

Перегрузка унарных операторов в C#

Всем доброго времени суток. На связи Алексей Гулынин. В данной статье я бы хотел рассказать про перегрузку унарных операторов в C#. Также поговорим про перегрузку операторов отношения ("<, ==, >" и т.д.).Приведу некоторые сведения из предыдущей статьи: для перегрузки оператора используется ключевое слово "operator", которое определяет операторный метод. Данный метод определяет действие оператора, т.е. ту логику, которую вы в него заложите.

Приведу общую форму перегрузки унарного оператора. Главное отличие перегрузки унарного оператора от бинарного заключается в том, что у унарных операторов имеется один операнд.

public static возвращаемый_тип operator oper (тип операнд)
{
  // логика
}

"oper" — это перегружаемый оператор, например + или *. "возвращаемый_тип" — обычно тип класса. Операторные методы обязательно должны быть public и static. В параметрах оператора нельзя использовать модификаторы ref и out.

Ниже приведу пример использования перегрузки унарных операторов. Будем использовать наш класс Coords3D, который будет хранить координаты объекта в трехмерном пространстве. Перегрузим оператор "++", который будет увеличивать координаты на "+2":

class Coords3D
{
  int x, y, z;

  public Coords3D(int x, int y, int z)
  {
    this.x = x;
    this.y = y;
    this.z = z;
  }

  public Coords3D() { }

  public override string ToString()
  {
    return "Coords (x, y, z) = (" + this.x + ", " + this.y + ", " + this.z + ")";
  }

  public static Coords3D operator ++(Coords3D object1)
  {
    Coords3D object2 = new Coords3D();
    object2.x = object1.x + 2;
    object2.y = object1.y + 2;
    object2.z = object1.z + 2;
    return object2;
  }

Проверим результат работы перегрузки оператора инкремента ("++"):

static void Main(string[] args)
{
  Coords3D object1 = new Coords3D(5, 10, 15);
  object1++;
  // Coords (x, y, z) = (7, 12, 17)
  Console.WriteLine(object1.ToString());

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

В качестве домашнего задания реализуйте перегрузку оператора инкремента ("—").

Следующий код демонстрирует перегрузку операторов отношения " > " и " < ". Если вы в коде перегружаете один из этих операторов, то требуется перегрузить и другой:

public static bool operator > (Coords3D object1, Coords3D object2)
{
  return (object1.x > object2.x && object1.y > object2.y && object1.z > object2.z) ? true : false;
}

public static bool operator < (Coords3D object1, Coords3D object2)
{
  return (object1.x < object2.x && object1.y < object2.y && object1.z < object2.z) ? true : false;
}

Результат работы:

Coords3D object1 = new Coords3D(5, 10, 15);
Coords3D object2 = new Coords3D(3, 8, 9);
if (object1 > object2) Console.WriteLine("Object 1 > Object 2");
	else Console.WriteLine("Object 1 < Object 2");

Данный пример является надуманным, т.к. если, например, координату "y" у второго объекта сделать больше, чем у первого (к примеру 11), то выйдет сообщение, что "Object1 < Object2", хотя это не является правильным. Предлагаю вам исправить данное упущение.

В данной статье вы узнали про перегрузку унарных операторов в C#, а также про перегрузку операторов отношения.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *