Перегрузка операций

Как я уже отмечал, в С# можно перегружать операции. Сразу же оговорюсь, что перегрузка операций для примитивных типов невозможна, так как эти типы определяются классами, которые не могут иметь наследников (они объявлены с зарезервированным словом sealed).

Перегруженная операция реализуется в виде специального метода класса, определенного с модификатором operator. Этот метод вызывается неявно, когда в выражении встречается знак соответствующей операции.

Для иллюстрации перегрузки операций рассмотрим программу, представленную в листинге 6.2 (файл Ch06\Point\Program.cs).

Листинг 6.2. Иллюстрация перегрузки операций

using System;

class Point

/*

Класс Point определяет координаты точки.

Он имеет перегруженные операции + и -, а также

перегруженный конструктор и метод ToString().

*/

{

private int x, y; // Координаты точки

public Point(){} // Умалчиваемый конструктор

public Point(int xPos, int yPos)

// Перегруженный конструктор принимает координаты точки

{

x = xPos;

y = yPos;

}

public override string ToString()

// Перегруженный метод ToString() возвращает строку с координатами

{

return "X pos: " + this.x + "; Y pos = " + this.y;

}

public static Point operator + (Point p1, Point p2)

// Перегруженная операция "+" возвращает объект класса Point

{

Point newPoint = new Point(p1.x + p2.x, p1.y + p2.y);

return newPoint;

}

public static Point operator - (Point p1, Point p2)

// Перегруженная операция "-" возвращает объект класса Point

{

Point newPoint = new Point(p1.x - p2.x, p1.y - p2.y);

return newPoint;

}

static void Main()

{

Point pt1 = new Point(100, 100);

Point pt2 = new Point(40, 40);

Console.WriteLine("1-я точка: {0}\n2-я точка: {1}\n",

pt1.ToString(), pt2.ToString());

Point bigPoint = pt1 + pt2; // Сложение точек

Console.WriteLine("Сложение : {0}", bigPoint.ToString());

Point minorPoint = pt1 - pt2; // Вычитание точек

Console.WriteLine("Вычитание : {0}", minorPoint.ToString());

Console.ReadLine();

}

}

Для удобства работы с объектами класса Point перегружен умалчиваемый конструктор так, чтобы при создании объекта сразу же определялись координаты точки. При перегрузке конструктора умалчиваемый конструктор, которым снабжаются все классы, теряется. Чтобы этого не произошло, в классе Point он объявляется повторно. Как это видно из программы, умалчиваемый конструктор во многих случаях не нужен. Я включил его специально, чтобы показать, как в общем случае выполнять его перекрытие.

Перегруженный метод ToString() возвращает строку с координатами точки.

Методы с модификаторами operator перегружают соответствующие операции. Замечу, что при объявлении перегруженной операции должны в обязательном порядке использоваться модификаторы public и static.

Предлагаю ознакомиться с аналогичными статьями: