Как я уже отмечал, в С# можно перегружать операции. Сразу же оговорюсь, что перегрузка операций для примитивных типов невозможна, так как эти типы определяются классами, которые не могут иметь наследников (они объявлены с зарезервированным словом 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.
0 коммент.:
Отправить комментарий