Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
48
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

4.2.4. Перезагрузка операторов Перезагрузка операторов

1. Основы перезагрузки операторов

В С#, подобно любому языку программирования, имеется готовый набор лексем, используемых для выполнения базовых операций над встроенными типами. Например, известно, что операция + может применяться к двум целым, чтобы дать их сумму:

// Операция + с целыми

int а = 100;

int b = 240;

int с = а + b; // с теперь равно 340

Здесь нет ничего нового, но есть возможность, что одна и та же операция «+» может применяться к большинству встроенных типов данных С#? Например, рассмотрим такой код:

// Операция + со строками

string si = "Hello";

string s2 = " world!";

string s3 = si + s2; // s3 теперь содержит "Hello world!"

По сути, функциональность операции «+» уникальным образом базируются на представленных типах данных (строках или целых в данном случае). Когда операция «+» применяется к числовым типам, получаем арифметическую сумму операндов. Однако когда та же операция применяется к строковым типам, получается конкатенация строк.

Язык С# предоставляет возможность строить специальные классы и структуры, которые также уникально реагируют на один и тот же набор базовых лексем (вроде операции «+»). Имейте в виду, что абсолютно каждую встроенную операцию С# перегружать нельзя. В следующей таблице описаны возможности перегрузки основных операций:

Операция С#

Возможность перегрузки

+, -, !, ++, —, true, false

Этот набор унарных операций может быть перегружен

+, -, *, /, %, &, |, ^, <<, >>

Эти бинарные операции могут быть перегружены

==, !=, <, >, <=, >=

Эти операции сравнения могут быть перегружены. С# требует совместной перегрузки «подобных» операций (т.е. < и >, <= и >=, == и !=)

[]

Операция «[]» не может быть перегружена. Однако, аналогичную функциональность предлагают индексаторы

()

Операция «()» не может быть перегружена. Однако ту же функциональность предоставляют специальные методы преобразования

+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

Сокращённые операции присваивания не могут перегружаться; однако вы получаете их автоматически, перегружая соответствующую бинарную операцию

Перегрузка операторов тесно связана с перегрузкой методов. Для перегрузки оператора служит ключевое слово operator, определяющее операторный метод, который, в свою очередь, определяет действие оператора относительно своего класса. Существуют две формы операторных методов (operator): одна — для унарных операторов, другая — для бинарных. Ниже приведена общая форма для каждой разновидности этих методов:

// Общая форма перегрузки унарного оператора

public static <возвращаемый тип> operator op(<тип параметра> <операнд>)

{

// Операции

}

// Общая форма перегрузки бинарного оператора

public static <возвращаемый тип> operator ор(<тип параметра1> <операнд11>!, <тип параметра2> <операнд>2)

{

// Операции

}

Здесь вместо ор подставляется перегружаемый оператор, например «+» или «/», а возвращаемый тип обозначает конкретный тип значения, возвращаемого указанной операцией. Это значение может быть любого типа, но зачастую оно указывается такого же типа, как и у класса, для которого перегружается оператор. Такая корреляция упрощает применение перегружаемых операторов в выражениях. Для унарных операторов операнд обозначает передаваемый операнд, а для бинарных операторов то же самое обозначают операнд1 и операнд2. Обратим внимание на то, что операторные методы должны иметь оба типа, public и static.