C#. Полное руководство.
Выполнение операций со встроенными в C# типами данных.
Для любого заданного класса и оператора имеется также возможность перегрузить сам операторный метод. Это, в частности, требуется для того, чтобы разрешить операции с типом класса и другими типами данных, в том числе и встроенными. Вновь обратимся к классу 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.
Как подтверждает приведенный выше результат, когда оператор + применяется к двум объектам класса ThreeD, то складываются их координаты. А когда он применяется к объекту типа ThreeD и целому значению, то координаты этого объекта увеличиваются на заданное целое значение.
Продемонстрированная выше перегрузка оператора +, безусловно, расширяет полезные функции класса ThreeD, тем не менее, она делает это не до конца. И вот почему. Метод operator+(ThreeD, int) позволяет выполнять операции, подобные следующей.
Оb1 = оb2 + 10;
Но, к сожалению, он не позволяет выполнять операции, аналогичные следующей.
Оb1 = 10 + оb2;
Дело в том, что второй целочисленный аргумент данного метода обозначает правый операнд бинарного оператора +, но в приведенной выше строке кода целочисленный аргумент указывается слева. Для того чтобы разрешить выполнение такой операции сложения, придется перегрузить оператор + еще раз. В этом случае первый параметр операторного метода должен иметь тип int, а второй параметр — тип ThreeD. Таким образом, в одном варианте метода operator+() выполняется сложение объекта типа ThreeD и целого значения, а во втором — сложение целого значения и объекта типа ThreeD. Благодаря такой перегрузке оператора + (или любого другого бинарного оператора) допускается появление встроенного типа данных как с левой, так и с правой стороны данного оператора. Ниже приведен еще один вариант класса ThreeD, в котором бинарный оператор + перегружается описанным выше образом.
// Перегрузить бинарный оператор + трижды:
// один -раз — для сложения объектов класса ThreeD,
// второй раз — для сложения объекта типа ThreeD и целого значения типа int,
// а третий раз — для сложения целого значения типа int и объекта типа ThreeD.
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; }.
// Перегрузить бинарный оператор + для сложения объектов класса ThreeD.
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;
}
// Перегрузить бинарный оператор + для сложения.
// целого значения типа int и объекта типа ThreeD.
public static ThreeD operator +(int op1, ThreeD op2) {
ThreeD result = new ThreeD();
result.x = op2.x + op1;
result.y = op2.y + op1;
result.z = op2.z + op1;
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();
c = b + 10; // сложить объект типа ThreeD и целое значение типа int.
Console.Write("Результат сложения b + 10: ");
c.Show();
Console.WriteLine();
c = 15 + b; // сложить целое значение типа int и объект типа ThreeD.
Console.Write("Результат сложения 15 + b: ");
c.Show();
}
}
Выполнение этого кода дает следующий результат.
Координаты точки а: 1, 2, 3.
Координаты точки b: 10, 10, 10.
Результат сложения а + b: 11, 12, 13.
Результат сложения b + 10: 20, 20, 20.
Результат сложения 15 + b: 25, 25, 25.
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
- 200.
- 201.
- 202.
- 203.
- 204.
- 205.
- 206.
- 207.
- 208.
- 209.
- 210.
- 211.
- 212.
- 213.
- 214.
- 215.
- 216.
- 217.
- 218.
- 219.
- 220.
- 221.
- 222.
- 223.
- 224.
- 225.
- 226.
- 227.
- 228.
- 229.
- 230.
- 231.
- 232.
- 233.
- 234.
- 235.
- 236.
- 237.
- 238.
- 239.
- 240.
- 241.
- 242.
- 243.
- 244.
- 245.
- 246.
- 247.
- 248.
- 249.
- 250.
- 251.
- 252.
- 253.
- 254.
- 255.
- 256.
- 257.
- 258.
- 259.
- 260.
- 261.
- 262.
- 263.
- 264.
- 265.
- 266.
- 267.
- 268.
- 269.
- 270.
- 271.
- 272.
- 273.
- 274.
- 275.
- 276.
- 277.
- 278.
- 279.
- 280.
- 281.
- 282.
- 283.
- 284.
- 285.
- 286.
- 287.
- 288.
- 289.
- 290.
- 291.
- 292.
- 293.
- 294.
- 295.
- 296.
- 297.
- 298.
- 299.
- 300.
- 301.
- 302.
- 303.
- 304.
- 305.
- 306.
- 307.