Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Выполнение операций со встроенными в С# типами данных
Для любого заданного класса и оператора имеется также возможность перегрузить сам операторный метод. Это, в частности, требуется для того, чтобы разрешить операции с типом класса и другими типами данных, в том числе и встроенными. Вновь обратимся к классу ThreeD. На примере этого класса ранее было показано, как оператор + перегружается для сложения координат одного объекта типа ThreeD с координатами другого. Но это далеко не единственный способ определения операции сложения для класса ThreeD. Так, было бы не менее полезно прибавить целое значение к каждой координате объекта типа ThreeD. Подобная операция пригодилась бы для переноса осей координат. Но для ее выполнения придется перегрузить оператор + еще раз, как показано ниже. Листинг 9.5 // Перегрузить бинарный оператор + для сложения объекта // типа 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. Следовательно, в этом методе разрешается сложение целого значения с каждым полем объекта типа ThreeD. Такая операция вполне допустима, потому что, как пояснялось выше, при перегрузке бинарного оператора один из его операндов должен быть того же типа, что и класс, для которого этот оператор перегружается. Но у второго операнда этого оператора может быть любой другой тип. Ниже приведен вариант класса ThreeD с двумя перегружаемыми методами оператора +. Листинг 9.6 // Перегрузить бинарный оператор + дважды: // один раз – для сложения объектов класса 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; }
// Перегрузить бинарный оператор + для сложения // объектов типа 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; }
// Вывести координаты 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(); } } При выполнении этого кода получается следующий результат. Координаты точки а: 1, 2, 3 Координаты точки b: 10, 10, 10 Результат сложения а+b: 11, 12, 13 Результат сложения b + 10: 20, 20, 20 Как подтверждает приведенный выше результат, когда оператор + применяется к двум объектам класса ThreeD, то складываются их координаты. А когда он применяется к объекту типа ThreeD и целому значению, то координаты этого объекта увеличиваются на заданное целое значение. Продемонстрированная выше перегрузка оператора +, безусловно, расширяет полезные функции класса ThreeD, тем не менее, она делает это не до конца. И вот почему. Метод operator+(ThreeD, int) позволяет выполнять операции, подобные следующей. ob1= оb2 + 10; Но, к сожалению, он не позволяет выполнять операции, аналогичные следующей. ob1 = 10 + оb2; Дело в том, что второй целочисленный аргумент данного метода обозначает правый операнд бинарного оператора +, но в приведенной выше строке кода целочисленный аргумент указывается слева. Для того чтобы разрешить выполнение такой операции сложения, придется перегрузить оператор + еще раз. В этом случае первый параметр операторного метода должен иметь тип int, а второй параметр - тип ThreeD. Таким образом, в одном варианте метода operator+() выполняется сложение объекта типа ThreeD и целого значения, а во втором - сложение целого значения и объекта типа ThreeD. Благодаря такой перегрузке оператора + (или любого другого бинарного оператора) допускается появление встроенного типа данных как с левой, так и с правой стороны данного оператора. Ниже приведен еще один вариант класса ThreeD, в котором бинарный оператор + перегружается описанным выше образом.
Листинг 9.7 // Перегрузить бинарный оператор + трижды: // один раз – для сложения объектов класса 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
|
||||||
Последнее изменение этой страницы: 2016-12-30; просмотров: 184; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.22.51.241 (0.026 с.) |