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

Автор: Topol Пятница, Июнь 8th, 2012 Нет комментариев

Рубрика: Программирование

Для классических типов данных в си шарп существуют всем известные базовые операции: +, -, *, /. Для данных целого типа они работают так же, как в математике. Но, например, сложение может использоваться и для данных строкового (string) типа. При этом используется тот же оператор сложения, только перегруженный – иначе говоря, переопределенный под собственные цели. Так перегрузка оператора сложения для строкового типа уже предусмотрена: складывая две строковые переменные, мы получаем одну переменную, составленную из двух:
string f = «Иванов»;
string n = « Вася»;
string fn = f+n; // Иванов Вася

Остальные операции нужно перегружать самостоятельно, создавая для этого соответствующие методы. Перегруженным может быть любой стандартный оператор. Нужно отметить, что некоторые операторы перегружаются парами: то есть, если написан метод, переопределяющий один из операторов из пары, компилятор будет выдавать ошибку о нехватке перегрузки второго «напарника». К парным операторам относятся: равенство (==) и неравенство(!=); «меньше» (<)  и «больше» (>); «меньше или равно» (<=) и «больше или равно» (>=).
Перегружая оператор, используют ключевое слово operator. Приведем пример перегрузки оператора ToString(), сложения и «меньше». Будем сравнивать две точки по координатам. Методы перегружаем внутри класса:
class MyPoint
{
private int x, y;
public MyPoint() { }
public MyPoint(int xP, int yP)
{
x = xP;
y = yP;
}

 public override string ToString()
{
return «X: » + this.x + «; Y: » + this.y;
}

 public static MyPoint operator +(CPoint pnt1, CPoint pnt2)
{
MyPoint newPoint = new MyPoint(pnt1.x + pnt2.x, pnt1.y + pnt2.y);
return newPoint;
}

    public static bool operator <(MyPoint pnt1, MyPoint pnt2)
{
if ((pnt1.x < pnt2.x) && (pnt1.y < pnt2.y))
{ return true; }
else
{ return false; }
}

     public override bool Equals(object o)
{
return true;
}

     public override int GetHashCode()
{
return 0;
}

 }

Головная программа:

MyPoint pt1 = new MyPoint(100, 100);
MyPoint pt2 = new MyPoint(40, 40);
if (pt1 < pt2)
{ Console.WriteLine(«X else
{ Console.WriteLine(«Y>X»);}
Console.WriteLine(pt1.ToString(), pt2.ToString());
MyPoint bigPoint = pt1 + pt2;
Console.WriteLine(bigPoint.ToString());

Оператор сравнения приводится не случайно, с ним связана некоторая хитрость: перегружая операторы сравнения, нужно обязательно перегружать также методы Equals и GetHashCode; для перегрузки других операторов этого делать не требуется.

Источник: cisharp.com

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты