Перегруженные операции
Бинарные операции. Пример объявления и вызова
Семантика перегружаемой операторной функции определяется решаемыми задачами и фантазией разработчика:
// Бинарные операции также обязаны возвращать значения! public static Point2D operator + (Point2D par1, Point2D par2) { return new Point2D(par1.x+par2.x,par1.y+par2.y); } // Реализуется алгоритм "сложения" значения типа Point2D // со значением типа float. // От перемены мест слагаемых сумма НЕ ИЗМЕНЯЕТСЯ. // Однако эта особенность нашей // операторной функции "сложения" (операции "сложения") должна быть // прописана программистом. // В результате получаем ПАРУ операторных функций, которые отличаются // списками параметров. // Point2D + float public static Point2D operator + (Point2D par1, float val) { return new Point2D(par1.x+val,par1.y+val); } // float + Point2D public static Point2D operator + (float val, Point2D par1) { return new Point2D(val+par1.x,val+par1.y); }
А вот применение этих функций. Внешнее сходство выражений вызова операторных функций с обычными выражениями очевидно. И при этом иного способа вызова операторных функций нет!
...p1 + p2... ...3.14 + p2... ...p2 + 3.14...
Операции сравнения реализуются по аналогичной схеме. Хотя не существует никаких ограничений на тип возвращаемого значения, в силу специфики применения (обычно в условных выражениях операторов управления) операций сравнения все же имеет смысл определять их как операторные функции, возвращающие значения true и false:
public static bool operator == (myPoint2D par1, myPoint2D par2) { if ((par1.x).Equals(par2.x) && (par1.y).Equals(par2.y)) return true; else return false; } public static bool operator != (myPoint2D par1, myPoint2D par2) { if (!(par1.x).Equals(par2.x) || !(par1.y).Equals(par2.y)) return true; else return false; } operator true и operator false
В известном мультфильме о Винни Пухе и Пятачке, Винни делает заключение относительно НЕПРАВИЛЬНОСТИ пчел. Очевидно, что по его представлению объекты — представители ДАННОГО класса пчел НЕ удовлетворяют некоторому критерию.
В программе можно поинтересоваться непосредственно значением некоторого поля объекта:
Point2D p1 = new Point2D(GetVal(), GetVal()); :::::::::: // Это логическое выражение! if ((p1.x).Equals(125)) {/*...*/}
Так почему же не спросить об этом у объекта напрямую?
Хотя бы так:
// Критерий истинности объекта зависит от разработчика. // Если значение выражения в скобках примет значение true, // то пчела окажется правильной! if (p1) {/*...*/}
В классе может быть объявлена операция (операторная функция) true, которая возвращает значение true типа bool для обозначения факта true и возвращает false в противном случае.
Классы, включающие объявления подобных операций (операторных функций), могут быть использованы в структуре операторов if, do, while, for в качестве условных выражений.
При этом, если в классе была определена операция true, в том же классе должна быть объявлена операция false:
// Перегрузка булевских операторов. Это ПАРНЫЕ операторы. // Объекты типа Point2D приобретают способность судить о правде и лжи! // А что есть истина? Критерии ИСТИННОСТИ (не путать с истиной) // могут быть самые разные. В частности, степень удаления от точки // с координатами (0,0). public static bool operator true (Point2D par) { if (Math.Sqrt(par.x*par.x + par.y*par.y) < 10.0) return true; else return false; } public static bool operator false (Point2D par) { double r = (Math.Sqrt(par.x*par.x + par.y*par.y)); if (r > 10.0 || r.Equals(10.0)) return false; else return true; }