double arrow

Перегрузка стандартных операций: назначение, синтаксические особенности, примеры реализации

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

Полиморфизм – позволяет использовать один и тот же интерфейс при реализации целого круга различных действий.

Как известно, в языке С# тип переменной определяет набор значений, которые она может хранить, а также набор операций, которые можно выполнять над этой переменной. Например, над значением переменной типа 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)

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: