Разработка компиляторов

       

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


  • Перегрузка - один из наиболее спорных механизмов современных языков
  • Перегрузка используется для сокращения записи операций над объектами

public static Matrix operator+ (Matrix left, Matrix right) { ... } ... Matrix c = new Matrix(); c = a + b;

Перегрузка операторов - это один из наиболее спорных механизмов в современных языках. Некоторые программисты считают, что перегрузка операторов помогает только в создании трудно находимых ошибок. Другие программисты считают механизм перегрузки операторов полезным как раз из соображений улучшения читаемости кода. Как бы то ни было, перегрузка операторов стала неотъемлемой частью C#. Например, большинство классов в C# по умолчанию перегружают оператор сравнения (операция == практически всегда означает вызов метода Equals , унаследованного от System.Object ).

Перегрузка операторов обычно используется для того, чтобы сократить и привести к привычному виду запись операций над объектами, определенными программистом. Скажем, с объектами, представляющими математические или физические величины, обычно ассоциируются арифметические операции. Возьмем, в качестве примера квадратные матрицы - для них естественно ввести операции сложения и умножения. Без перегрузки операторов эти действия пришлось бы записывать таким образом: A.Add(B) или Matrices.Add (A,B) . И та, и другая формы записи несколько непривычны, так как традиционной формой является запись вида A+B . Попробуем реализовать ее на C#:

public class Matrix { ... public static Matrix operator+ (Matrix left, Matrix right) { Matrix target = new Matrix(); for (int i=0; i<n; i++) for (int j=0; j<n; j++) target[i,j] = left[i,j] + right[i,j]; return target; }

При таком описании запись сложения матриц приобретает более знакомый вид:

Matrix c = new Matrix(); c = a + b;

Таким же образом можно было бы реализовать умножение и деление матриц, сравнение и другие операции.



Содержание раздела