Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Для любого заданного класса и оператора любой операторный метод сам может перегружаться. Одна из самых распространенных причин этого — разрешить операции между объектами этого класса и другими (встроенными) типами данных. В качестве примера давайте снова возьмем класс 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!