Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Выполнение операций над значениями встроенных С#-типов



Для любого заданного класса и оператора любой операторный метод сам может перегружаться. Одна из самых распространенных причин этого — разрешить операции между объектами этого класса и другими (встроенными) типами данных. В качестве примера давайте снова возьмем класс ThreeD. Вы видели, как перегрузить оператор "+", чтобы он суммировал координаты одного ThreeD-объекта с координатами другого. Однако это не единственный способ определения операции сложения для класса ThreeD. Например, может потребоваться суммирование какого-либо целого числа с каждой координатой ThreeD-объекта. Ведь тогда эту операцию можно использовать для смещения осей. Для ее реализации необходимо перегрузить оператор "+" еще раз, например, так:

// Перегружаем бинарный оператор "+" для суммирования

// объекта и int-значения.

public static ThreeD operator +(ThreeD opl, int op2)

{

ThreeD result = new ThreeD();

result.x = opl.x + op2;

result.у = opl.у + op2;

result.z = opl.z + op2;

return result;

}

Обратите внимание на то, что второй параметр имеет тип int. Таким образом, этот метод позволяет сложить int-значение с каждым полем ThreeD-объекта. Это вполне допустимо, поскольку, как разъяснялось выше, при перегрузке бинарного оператора тип только одного из его операндов должен совпадать с типом класса, для которого перегружается этот оператор. Другой операнд может иметь любой тип.

Ниже приведена версия класса ThreeD, которая имеет два перегруженных метода operator+().

/* Перегрузка оператора сложения для вариантов:

объект + объект и объект + int-значение. */

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace перегрузка_операторов_для_вариантов

{

using System;

// Класс трехмерных координат,

class ThreeD

{

int x, y, z; // 3-х-мерные координаты.

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 opl, ThreeD op2)

{

ThreeD result = new ThreeD();

/* Суммирование координат двух точек

и возврат результата. */

result.x = opl.x + op2.x;

result.y = opl.y + op2.y;

result.z = opl.z + op2.z;

return result;

}

// Перегружаем бинарный оператор "+" для варианта

// "объект + int-значение".

public static ThreeD operator +(ThreeD opl, int op2)

{

ThreeD result = new ThreeD();

result.x = opl.x + op2;

result.y = opl.y + op2;

result.z = opl.z + op2;

return result;

}

// Отображаем координаты X, Y, Z.

public void show()

{

Console.WriteLine(x + ", " + y + ", " + z);

}

}

class ThreeDDemo

{

public static void Main() {

ThreeD a = new ThreeD(1, 2, 3);

ThreeD b = new ThreeD (10, 10, 10);

ThreeD с = new ThreeD();

Console.Write("Координаты точки а: ");

a.show();

Console.WriteLine();

Console.Write("Координаты точки b: ");

b.show();

Console.WriteLine();

с = a + b; // объект + объект

Console.Write("Результат сложения а + b: ");

с.show();

Console.WriteLine();

с = b + 10; // объект + int-значение

Console.Write("Результат сложения b + 10: ");

с.show();

Console.ReadLine();

}

}

}

При выполнении программа генерирует следующие результаты:

Координаты точки а: 1, 2, 3

Координаты точки Ь: 10, 10, 10

Результат сложения а + Ь: 11, 12, 13

Результат сложения b + 10: 20, 20, 20

Как подтверждают результаты выполнения этой программы, если оператор "+" применяется к двум объектам, их соответствующие координаты суммируются. А если оператор "+" применяется к объекту и целому числу, то значения координат объекта увеличиваются на это целое число.

Несмотря на то что приведенный выше способ перегрузки оператора "+" существенным образом расширяет возможности класса ThreeD, работа на этом еще не окончена. И вот почему. Метод operator+ (ThreeD, int) позволяет выполнять инструкции, подобные следующей:

Но, к сожалению, он не позволяет выполнять инструкции такого рода:

Дело в том, что целочисленное значение принимается в качестве второго аргумента, которым является правый операнд. А в предыдущей инструкции целочисленный аргумент находится слева. Чтобы сделать допустимыми две формы инструкций, необходимо перегрузить оператор "+" еще раз. Новая версия должна будет в качестве первого параметра принимать значение типа int, а в качестве второго — объект типа ThreeD. И тогда старая версия метода operator+() будет обрабатывать вариант "объект + i n t -значение", а новая — вариант " i n t - значение + объект". Перегрузка оператора "+" (или любого другого бинарного оператора), выполненная подобным образом, позволит значению встроенного типа находиться слева или справа от оператора. Ниже приводится версия класса ThreeD, которая перегружает оператор "+" с учетом описанных выше вариантов приема аргументов.

/* Перегрузка оператора "+" для следующих вариантов:

объект + объект,

объект + int-значение и

int-значение + объект. */

using System;

// Класс трехмерных координат,

class ThreeD

{

int x, у, z; // 3-х-мерные координаты.

public ThreeD() { х = у = z = 0; }

public ThreeD(int i, int j, int k) {

x = i; у = j; z = k; }

// Перегружаем бинарный оператор "+" для варианта

// "объект + объект".

public static ThreeD operator +(ThreeD opl, ThreeD op2)

{

ThreeD result = new ThreeD();

/* Суммирование координат двух точек

и возврат результата. */

result.х = opl.x + ор2.х;

result.у = opl.у + ор2.у;

result.z = opl.z + op2.z;

return result;

}

// Перегружаем бинарный оператор "+" для варианта

// "объект + int-значение".

public static ThreeD operator +(ThreeD oplf int op2)

{

ThreeD result = new ThreeD();

result.x = opl.x + op2;

result.у = opl.y + op2;

result.z = opl.z + op2;

return result;

}

// Перегружаем бинарный оператор "+" для варианта

// "int-значение + объект".

public static ThreeD operator +(int opl, ThreeD op2)

{

ThreeD result = new ThreeD();

result.x = op2.x + opl;

result.у = op2.y + opl;

result.z = op2.z + opl;

return result;

}

// Отображаем координаты X, Y, Z.

public void show()

{

Console.WriteLine(x + ", " + у + ", " + z);

}

class ThreeDDemo

{

public static void Main()

{

ThreeD a = new ThreeD(1, 2, 3);

ThreeD b = new ThreeD(10, 10, 10);

ThreeD с = new ThreeD();

Console.Write("Координаты точки а: ");

a.show();

Console.WriteLine();

Console.Write("Координаты точки b: ");

b.show();

Console.WriteLine();

с = a + b; // объект + объект

Console.Write("Результат сложения a + b: ");

c.show();

Console.WriteLine();

с = b + 10; // объект + int-значение

Console.Write("Результат сложения b + 10: ");

с.show();

Console.WriteLine();

с = 15 + b; // int-значение + объект

Console.Write("Результат сложения 15 + b: ");

с.show();

}

}

}

Вот результаты выполнения этой программы:

Координаты точки а: 1, 2, 3

Координаты точки b: 10, 10, 10

Результат сложения а + b: 11, 12, 13

Результат сложения b + 10: 20, 20, 20

Результат сложения 15 + b: 25, 25, 25





Дата публикования: 2015-06-12; Прочитано: 302 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.013 с)...