Имя Пароль
Зарегистрироваться


* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



Перегрузка операторов в Visual C#
8 февраля 2009

При работе с пользовательскими типами данных порой удобно определять арифме-
тические или логические операторы, а также операторы сравнения, способные ра-
ботать с этими типами. Рассмотрим следующую структуру:
Visual C#
public struct HoursWorked
float Regular-Hours;
float OvertimeHours;
Подобную простую структуру можно использовать в бухгалтерском приложении
для учета часов рабочего времени и сверхурочных, но при работе с несколькими
экземплярами такой структуры возможны сложности. Представьте, например, что
требуется сложить значения двух экземпляров такой структуры. Чтобы решить эту
задачу, придется писать новый метод, способный складывать экземпляры этой
структуры. Для сложения трех и больше экземпляров потребуется вызвать этот ме-
тод несколько раз. К счастью, С# позволяет определять поведение оператора при
обработке пользовательских типов данных. Например, чтобы получить возможность
суммировать структуру из нашего примера, можно создать перегруженную версию
оператора «+», добавив к ней необходимую функциональность.
Перегруженные операторы создают с помощью ключевого слова operator, имею-
щего следующий синтаксис:
Visual C#
public static type operator op (Argument1[, Argument2~\')
II Здесь должна быть реализация.
где type — это тип, с которым работает оператор, он одновременно является типом
значения, возвращаемого оператором; Argument 1 и Argumem2~ это аргументы опе-
ратора. Любой унарный оператор обрабатывает только один аргумент с типом type.
Бинарные операторы требуют два аргумента, минимум один из которых должен
быть с типом type. Op — это, собственно, оператор, например «+», «—», «>», «!=» и
т.д. Перегруженные операторы необходимо объявлять с модификаторами public
(чтобы клиенты, работающие с вашим типом данных, смогли получить к нему дос-
туп) и static. Перегруженный оператор следует объявлять внутри определения поль-
зовательского типа данных, для работы с которым он предназначен. Мы рассмот-
рели пример со структурой, но также можно определить перегруженный оператор,
способный работать с классами, — все перегруженные операторы определяются
одинаково. Вот пример перегруженного оператора «+», предназначенного для ра-
боты с созданной выше структурой HoursWorked:
Visual C#
public struct HoursWorked
float RegularHours;
float OvertimeHours;
// Перегруженный оператор должен быть объявлен в определении класса,
// для работы с которым он предназначен.
public static HoursWorked operator + (HoursWorked a, HoursWorked b)
HoursWorked Result = new HoursWorkedO;
Result.RegularHours - a.RegularHours + b.RegularHours;
Result.OvertimeHours = a.OvertimeHours + b.OvertimeHours;
return Result;
Перегруженный оператор используют в программе, как любой другой оператор.
Ниже показан пример кода, выполняющего сложение двух экземпляров структуры
Hours Worked:
Visual C#
// Этот пример предполагает, что переменные Sunday и Monday содержат
// экземпляры структуры HoursWorked, инициализированные соответствующими
// значениями.
HoursWorked total - new HoursWorkedO;
total - Sunday + Monday;
Как и в случае с перегруженными методами, допустимо создавать различные
реализации перегруженных операторов при условии, что они отличаются сигнату-
рами, Вернемся к примеру со структурой HoursWorked, Допустим, нам потребова-
лась возможность прибавлять значения типа Integer к полю NormalHours с помощью
оператора «+». Эту задачу удастся решить, создав еще одну версию перегруженного
оператора «+»:
Visual C#
float RegularHours;
float OvertimeHours;
// Это версия перегруженного оператора, определенная в предыдущем примере.
oublic static Hot-rsWorked operator + (HoursWorked a, HoursWorked b)
{
HoursWorked Result = new HoursWorkedO;
Result.RegularHours - a.RegularHours + b.RegularHours;
Result.OvertimeHours = a.OvertimeHours + b.OvertimeHours;
return Result;
// Новая версия перегруженного оператора + с новой реализацией.
public static HoursWorked operator + (HoursVJorked a, int b)
{
HoursWorked Result = new HoursWorkedO;
Result. RegularHours = a.RegularHours + b:
return Result;
Чтобы создать перегруженный оператор с помощью Visual C#, выполните сле-
дующие действия.
1. Объявите перегруженный оператор внутри определения класса или структуры,
для работы с которыми он предназначен, при помоши ключевого слова operator.
Перегруженные операторы необходимо объявлять с модификаторами public и
static. Если объявляется бинарный оператор, по крайней мере один из его аргу-
ментов должен иметь тот же тип, что и возвращаемое значение,
2. Напишите реализацию для оператора.

Теги: .NET

Статьи по теме:

Извлечение типизированных данных с помощью объекта DataReader
Графический дизайнер
Сокрытие членов базового класса в Visual C#
Свойства-наборы
Декларативная защита, основанная на ролях
Редактор реестра
Установка приложения
Создание формы
Установка точек прерывания
Объект Graphics
Перегрузка членов
Типы значений и ссылочные типы
Свойства Font, Cursor и BackGroundlmage
Доступ к «плоским» файлам
Структуры CTS
| .NET | Pavel |
 


Пн Вт Ср Чт Пт Сб Вс
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


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | .NET | Перегрузка операторов в Visual C#. Регион сайта: Москва и Санкт-Петербург