Перегрузка унарных операторов в C#

Всем доброго времени суток. На связи Алексей Гулынин. В данной статье я бы хотел рассказать про перегрузку унарных операторов в C#. Также поговорим про перегрузку операторов отношения ("<, ==, >" и т.д.).Приведу некоторые сведения из предыдущей статьи: для перегрузки оператора используется ключевое слово "operator", которое определяет операторный метод. Данный метод определяет действие оператора, т.е. ту логику, которую вы в него заложите.
Приведу общую форму перегрузки унарного оператора. Главное отличие перегрузки унарного оператора от бинарного заключается в том, что у унарных операторов имеется один операнд.
public static возвращаемый_тип operator oper (тип операнд) { // логика }
"oper" — это перегружаемый оператор, например + или *. "возвращаемый_тип" — обычно тип класса. Операторные методы обязательно должны быть public и static. В параметрах оператора нельзя использовать модификаторы ref и out.
Ниже приведу пример использования перегрузки унарных операторов. Будем использовать наш класс Coords3D, который будет хранить координаты объекта в трехмерном пространстве. Перегрузим оператор "++", который будет увеличивать координаты на "+2":
class Coords3D { int x, y, z; public Coords3D(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public Coords3D() { } public override string ToString() { return "Coords (x, y, z) = (" + this.x + ", " + this.y + ", " + this.z + ")"; } public static Coords3D operator ++(Coords3D object1) { Coords3D object2 = new Coords3D(); object2.x = object1.x + 2; object2.y = object1.y + 2; object2.z = object1.z + 2; return object2; }
Проверим результат работы перегрузки оператора инкремента ("++"):
static void Main(string[] args) { Coords3D object1 = new Coords3D(5, 10, 15); object1++; // Coords (x, y, z) = (7, 12, 17) Console.WriteLine(object1.ToString()); Console.WriteLine("Нажмите клавишу для продолжения..."); Console.ReadLine(); }
В качестве домашнего задания реализуйте перегрузку оператора инкремента ("—").
Следующий код демонстрирует перегрузку операторов отношения " > " и " < ". Если вы в коде перегружаете один из этих операторов, то требуется перегрузить и другой:
public static bool operator > (Coords3D object1, Coords3D object2) { return (object1.x > object2.x && object1.y > object2.y && object1.z > object2.z) ? true : false; } public static bool operator < (Coords3D object1, Coords3D object2) { return (object1.x < object2.x && object1.y < object2.y && object1.z < object2.z) ? true : false; }
Результат работы:
Coords3D object1 = new Coords3D(5, 10, 15); Coords3D object2 = new Coords3D(3, 8, 9); if (object1 > object2) Console.WriteLine("Object 1 > Object 2"); else Console.WriteLine("Object 1 < Object 2");
Данный пример является надуманным, т.к. если, например, координату "y" у второго объекта сделать больше, чем у первого (к примеру 11), то выйдет сообщение, что "Object1 < Object2", хотя это не является правильным. Предлагаю вам исправить данное упущение.
В данной статье вы узнали про перегрузку унарных операторов в C#, а также про перегрузку операторов отношения.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях