Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GEK / ООП_ГОСЫ_ОТВЕТЫ.docx
Скачиваний:
68
Добавлен:
18.05.2015
Размер:
1.83 Mб
Скачать

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

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

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

int а = 100;

int b = 240;

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

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

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

string si = "Hello";

string s2 = " world!";

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

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

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

Операция С#

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

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

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

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

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

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

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

[]

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

()

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

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

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

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

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

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

{

// операции

}

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

public static возвращаемый_тип operator ор(тип_параметра1 операнд1,

тип_параметра2 операнд2)

{

// операции

}

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

Соседние файлы в папке GEK