Унарные операторы перегружаются таким же образом, как и бинарные. Главное отличие заключается, конечно, в том, что у них имеется лишь один операнд. В качестве примера ниже приведен метод, перегружающий оператор унарного минуса для класса ThreeD.
// Перегрузить оператор унарного минуса.
public static ThreeD operator - (ThreeD op)
{
ThreeD result = new ThreeD ();
result.x = -op.x;
result.у = -op.у;
result.z = -op.z;
return result;
}
Обратите внимание на то, что сам операнд не меняется. Это означает, что и в данном случае обычное назначение оператора унарного минуса сохраняется. Например, результатом выражения
а = -b
является отрицательное значение операнда b, но сам операнд b не меняется.
В C# перегрузка операторов ++ и -- осуществляется довольно просто. Для этого достаточно возвратить инкрементированное или декрементированное значение, но не изменять вызывающий объект. А все остальное возьмет на себя компилятор С#, различая префиксные и постфиксные формы этих операторов.
// Перегрузить унарный оператор ++.
public static ThreeD operator ++(ThreeD op)
|
|
{
ThreeD result = new ThreeD();
// Возвратить результат инкрементирования.
result.x = op.x + 1;
result.у = op.у + 1;
result.z = op.z + 1;
return result;
}
___________________________________________________________________________________________________
//пример перегрузки бинарных и унарных операторов
using System;
//класс для хранения трехмерных координат
class ThreeD
{
int x, y, z; //трехмерные координаты
public ThreeD() { x = y = z = 0; }
public ThreeD(int i, int j, int k) { x = i; y = j; z = k; }
//перегрузить бинарный оператор +.
public static ThreeD operator +(ThreeD op1, ThreeD op2)
{
ThreeD result = new ThreeD();
//сложить координаты двух точек и возвратить результат.
result.x = op1.x + op2.x;
result.y = op1.y + op2.y;
result.z = op1.z + op2.z;
return result;
}
//перегрузить бинарный оператор -.
public static ThreeD operator -(ThreeD op1, ThreeD op2)
{
ThreeD result = new ThreeD();
//обратить внимание на порядок следования операндов:
//op1 - левый операнд, op2 - правый операнд.
result.x = op1.x - op2.x;
result.y = op1.y - op2.y;
result.z = op1.z - op2.z;
return result;
}
//перегрузить унарный оператор -.
public static ThreeD operator -(ThreeD op)
{
ThreeD result = new ThreeD();
result.x = -op.x;
result.y = -op.y;
result.z = -op.z;
return result;
}
//перегрузить унарный оператор ++.
public static ThreeD operator ++(ThreeD op)
{
ThreeD result = new ThreeD();
//возвратить результат инкреминирования.
result.x = op.x + 1;
result.y = op.y + 1;
result.z = op.z + 1;
return result;
}
//вывести координаты X, Y, Z.
public void Show()
{
Console.WriteLine(x + ", " + y + ", " + z);
}
}
class ThreeDDemo
{
static void Main()
{
ThreeD a = new ThreeD(1, 2, 3);
ThreeD b = new ThreeD(10, 10, 10);
ThreeD c = new ThreeD();
Console.Write("Координаты точки а: ");
a.Show();
Console.WriteLine();
Console.Write("Координаты точки b: ");
b.Show();
Console.WriteLine();
c = a + b;
Console.Write("Результат сложения a + b: ");
c.Show();
Console.WriteLine();
c = a + b + c;
Console.Write("Результат сложения a + b + c: ");
c.Show();
Console.WriteLine();
c = c - a;
Console.Write("Результат вычитания c - a: ");
c.Show();
Console.WriteLine();
|
|
c = c - b;
Console.Write("Результат вычитания c - b: ");
c.Show();
Console.WriteLine();
c = -a;
Console.Write("Результат присваивания -а: ");
c.Show();
Console.WriteLine();
c = a++;
Console.WriteLine("Если c = a++");
Console.Write("то координаты точки с равны ");
c.Show();
Console.Write("а координаты точки a равны ");
a.Show();
//установить исходные координаты (1,2,3) точки а
a = new ThreeD(1, 2, 3);
Console.Write("\nУстановка исходных координат точки а: ");
a.Show();
c = ++a;
Console.WriteLine("\nЕсли с = ++a");
Console.Write("то координаты точки с равны ");
c.Show();
Console.Write("а координаты точки а равны ");
a.Show();
}
}