Перегрузка операций
Одна из целей языка С# состоит в том, чтобы обеспечить классам, определенным пользователем, обладание всей функциональностью базовых типов. Предположим, программист определяет тип, представляющий одномерные массивы.
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; просмотров: 281;