Перегрузка методов – это один из способов, которым достигается полиморфизм в языке С#. Две и более функции могут иметь одно и то же имя, а отличаться набором аргументов в интерфейсе (описании).
Полиморфизм – позволяет использовать один и тот же интерфейс при реализации целого круга различных действий.
Как известно, в языке С# тип переменной определяет набор значений, которые она может хранить, а также набор операций, которые можно выполнять над этой переменной. Например, над значением переменной типа int программа может выполнять сложение, вычитание, умножение и деление. С другой стороны, использование оператора “плюс” для сложения двух экземпляров реализованного программистом класса лишено смысла.
Когда в программе определяется класс, то по существу определяется новый тип данных. Тогда язык C# позволяет определить операции, соответствующие этому новому типу данных.
Например, пусть имеется:
myclass a,bc;…//a,b,c-экземпляры класса myclass
c=a+b; // перегруженная операция сложения для класса myclass
|
|
Перегрузка операций обычно применяется для классов, описывающих математические или физические понятия, то есть таких классов, для которых требуется выполнить соответствующие операции.
Общий синтаксис объявления перегруженной операции:
[атрибуты] спецификаторы operator тело операции,
где:
Спецификаторы – public,static,extern
operator – ключевое слово, определяющее перегруженную операцию
тело операции-действия, которые выполняются при использовании операции в выражении
Перегружать можно только стандартные операции.
Алгоритм перегрузки операции:
1. Определить класс, которому данная операция будет назначена.
2. Для перегрузки операций используется ключевое слово operator.
3. Переопределяя операцию, необходимо указать метод, который C# вызывает каждый раз, когда класс использует перегруженную операцию. Этот метод, в свою очередь, выполняет соответствующую операцию.
Правила перегрузки операции:
1. Операция должна быть объявлена как public static
2. Параметры в операцию должны передаваться по значению (не ref, не out)
3. Двух одинаковых перегруженных операций в классе не должно быть
class array2
{ …
//функция перегрузки операции умножения как метод класса
array2& operator*(array2& m2)
{ if(m==m2.n)
{array2 *pta;
int s;
pta=new array2(n,m2.m);
for(int i=0;i<n;i++)
{ for(int j=0;j<m2.m;j++)
{s=0;
for(int k=0;k<m;k++)
s+=mas[i][k]*m2.mas[k][j];
pta->mas[i][j]=s;
}
}
return *pta;
}
else throw invalid_argument(“Не совпадают размеры массивов”);
}
…
};
main()
{ array2 m(2,3),m1(3,4),m2(2,4);
…
m2=m*m1;//можно записать в виде m2=m.operator *(m1)
}