Шаг 116.
Язык программирования C#. Начала
Перегрузка операторов. Команды присваивания и перегрузка операторов

    На этом шаге мы рассмотрим особенности реализации перегрузки операторов присваивания.

    Ранее утверждалось, что сокращенные формы оператора присваивания (+=, *=, /= и так далее) не перегружаются, но можно так перегрузить базовые операторы (например, +, * или /), что сокращенные формы операторов можно будет использовать в программе. Главный критерий здесь состоит в том, чтобы тип результата, возвращаемого операторным методом для базового оператора, соответствовал типу переменной, которой присваивается значение с помощью сокращенной формы оператора присваивания. Но и здесь не все так очевидно. Как пример, иллюстрирующий сказанное, рассмотрим программу в примере ниже.

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, после чего выполняются команды А+=В и А*=В.

    При выполнении команды

  А += В;
сначала вычисляется сумма А+В. Результатом является объект, целочисленное поле которого равно сумме полей объектов А и В. Ссылка на этот объект записывается в переменную А.

    При выполнении команды

  А *= В;
сначала вычисляется произведение А*В. Значением этого выражения является целое число, равное произведению значений полей объектов А и В. Вообще, число присвоить значением объектной переменной нельзя. Но в нашем случае в классе MyClass описан оператор неявного приведения типа int к типу MyClass. Этот операторный метод будет задействован, и на основе числового значения A*B создается объект, а ссылка на этот объект записывается в переменную А.

    На следующем шаге мы резюмируем все ранее сказанное по данной теме на предыдущих шагах.




Предыдущий шаг Содержание Следующий шаг