Перегрузка операций


 

Одна из целей языка С# состоит в том, чтобы обеспечить классам, определенным пользователем, обладание всей функциональностью базовых типов. Предположим, программист определяет тип, представляющий одномерные массивы.

 

int[n]Array;

 

Обеспечить этот класс функциональностью базовых типов - значит, получить возможность выполнять арифметические операции над объектами класса (складывать массивы, умножать их и т. д.). Конечно, программист, определивший тип, может реализовать методы для каждой из требуемых операций. Например, если необходимо увеличить элементы массива в n раз, то можно определить метод Array.Mul(int n) и затем вызвать его из основной программы:

 

ar1.Mul(n);

 

Однако, гораздо нагляднее написать:

 

ar1 *= n;

 

Такие операторы интуитивно понятны и написаны в том же стиле, что и операторы сложения базовых типов, например int.

 

Все перегруженные операторы должны быть открытыми статическими функциями класса. Следовательно, унарные операторы будут иметь один параметр, а бинарные - два. Эти параметры должны быть типа класса, в котором реализуется данная функция.

Можно перегружать следующие унарные операторы: +, -, !, ~, ++, --, true, false

Например, пусть необходимо для класса Array перегрузить унарную операцию “–“ так, чтобы все элементы массива изменили знак:

 

public static Array operator -(Array ar)

{

for (int i = 0; i < ar.n; i++)

ar.ar[i] = -ar.ar[i];

return ar;

}

Можно перегружать следующие бинарные операторы: +, -, *, /, %, &, |, ^, <<, >>

Для данных операторов справедливы следующие правила: один из двух параметров функции должен быть типа класса; если в классе перегружен оператор + (например), то оператор += перегружается автоматически (это справедливо для всех вышеперечисленных бинарных операторов).

Так, чтобы перегрузить операцию сложения (+), следует написать:

public static Array operator+(Array ar1, Array ar2)

Синтаксис перегрузки операции в языке С# предписывает указывать ключевое слово operator и знак перегружаемой операции после него.

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

Теперь, если написать:

Array arS = ar1 + ar2;

то будет вызвана перегруженная операция +, которой переменная ar1 будет передана в качестве первого параметра, а переменная ar2 - в качестве второго. Когда компилятор встречает выражение:

ar1+ ar2

он преобразует его в:

Array.operator+(ar1, ar2)

 

В результате возвращается новое значение типа Array, которое в данном случае присваивается объекту Array с именем arS.

 

public static Array operator +(Array ar1, Array ar2)

{

int n=ar1.n;

Array arS = new Array(n);

for (int i = 0; i < n; i++)

arS.ar[i] = ar1.ar[i] + ar2.ar[i];

return arS;

}

Перегрузка оператора «*» для умноження элементов массива на число int:

public static Array operator *(Array ar1, int m)

{

for (int i = 0; i < ar1.n; i++)

ar1.ar[i] *= m;

return ar1;

}

Операторы сравнения ==, !=, <, >, <=, >= всегда перегружаются парами: == и !=, < и >, <= и >=. Ниже в примере показаны методы для сравнения двух строк матрицы по числу нулевых элементов, перегружающие операторы == и !=. В паре с ними желательно перегружать функцию Equals, которая наследуется из базового класса Object,, чтобы их функциональность не различалась.



Дата добавления: 2021-12-14; просмотров: 289;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.