Для любого заданного класса и оператора имеется также возможность перегрузить сам операторный метод. Это, в частности, требуется для того, чтобы разрешить операции с типом класса и другими типами данных, в том числе и встроенными. Вновь обратимся к классу ThreeD
. На примере этого класса ранее было показано, как оператор + перегружается для сложения координат одного объекта типа ThreeD
с координатами другого. Но это далеко не единственный способ определения операции сложения для класса ThreeD
. Так, было бы не менее полезно прибавить целое значение к каждой координате объекта типа ThreeD
. Подобная операция пригодилась бы для переноса осей координат. Но для ее выполнения придется перегрузить оператор + еще раз, как показано ниже.
// Перегрузить бинарный оператор + для сложения объекта
// типа ThreeD и целого значения типа int.
public static ThreeD operator +(ThreeD op1, int op2)
{
ThreeD result = new ThreeD();
result.x = op1.x + op2;
result.у = op1.y + op2;
result.z = op1.z + op2;
return result;
}
Как видите, второй параметр операторного метода имеет тип int
. Следовательно, в этом методе разрешается сложение целого значения с каждым полем объекта типа ThreeD
. Такая операция вполне допустима, потому что, как пояснялось выше, при перегрузке бинарного оператора один из его операндов должен быть того же типа, что и класс, для которого этот оператор перегружается. Но у второго операнда этого оператора может быть любой другой тип.
Ниже приведен вариант класса ThreeD
с двумя перегружаемыми методами оператора +.
// Перегрузить бинарный оператор + дважды:
// один раз — для сложения объектов класса ThreeD,
// а другой раз — для сложения объекта типа ThreeD и целого значения типа int.
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;
}
// Перегрузить бинарный оператор + для сложения
// объекта типа ThreeD и целого значения типа int.
public static ThreeD operator +(ThreeD op1, int op2) {
ThreeD result = new ThreeD();
result.x = op1.x + op2;
result.y = op1.y + op2;
result.z = op1.z + op2;
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: ");
a.Show();
Console.WriteLine();
Console.Write("Координаты точки b: ");
b.Show();
Console.WriteLine();
c = a + b; // сложить объекты класса ThreeD
Console.Write("Результат сложения a + b: ");
c.Show();
Console.WriteLine();
Console.Write("Результат сложения b + 10: ");
c.Show();
}
}
При выполнении этого кода получается следующий результат.
Координаты точки а: 1, 2, 3
Координаты точки b: 10, 10, 10
Результат сложения а+b: 11, 12, 13
Результат сложения b + 10: 20, 20, 20