На этом шаге мы рассмотрим особенности реализации перегрузки операторов присваивания.
Ранее утверждалось, что сокращенные формы оператора присваивания (+=, *=, /= и так далее) не перегружаются, но можно так перегрузить базовые операторы (например, +, * или /), что сокращенные формы операторов можно будет использовать в программе. Главный критерий здесь состоит в том, чтобы тип результата, возвращаемого операторным методом для базового оператора, соответствовал типу переменной, которой присваивается значение с помощью сокращенной формы оператора присваивания. Но и здесь не все так очевидно. Как пример, иллюстрирующий сказанное, рассмотрим программу в примере ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr116_1 { // Класс с перегрузкой операторов: class MyClass { // Целочисленное поле: public int code; // Конструктор с одним аргументом: public MyClass(int n) { code = n; // Присваивание значения полю } // Операторный метод для сложения объектов: public static MyClass operator +(MyClass a, MyClass b) { return new MyClass(a.code + b.code); } // Операторный метод для умножения объектов: public static int operator *(MyClass a, MyClass b) { return a.code * b.code; } // Операторный метод для неявного приведения типа // (из типа int к типу MyClass): public static implicit operator MyClass(int n) { return new MyClass(n); } } // Класс с главным методом: class Program { static void Main() { // Создание объекта: MyClass A = new MyClass(7); // Проверка результата: Console.WriteLine("Объект A: {0}", A.code); // Создание объекта: MyClass B = new MyClass(8); // Проверка результата: Console.WriteLine("Объект В: {0}", B.code); // Вычисление суммы объектов с использованием // сокращенной формы оператора присваивания: A += B; // Проверка результата: Console.WriteLine("Объект А: {0}", A.code); // Вычисление произведения объектов с использованием // сокращенной формы оператора присваивания: A *= B; // Проверка результата: Console.WriteLine("Объект А: {0}", A.code); // Задержка: Console.ReadLine(); } } }
Результат выполнения программы такой, как показано ниже.
Рис.1. Результат выполнения программы
В классе MyClass (с числовым полем и конструктором с одним аргументом) описаны операторные методы для вычисления суммы объектов класса MyClass, произведения объектов класса MyClass, а также оператор для неявного приведения целочисленного значения к объекту класса MyClass. В главном методе программы создаются два объекта А и В класса MyClass, после чего выполняются команды А+=В и А*=В.
При выполнении команды
А += В;
При выполнении команды
А *= В;
На следующем шаге мы резюмируем все ранее сказанное по данной теме на предыдущих шагах.