Урок 15. Перегрузка бинарных операторов

Автор: admin | 14 Июнь 2008 – 16:03 -


Урок 15. Перегрузка бинарных операторов

Перегрузка операторов – это задание для известных операторов (например, для +) новых значений. Например, мы можем перегрузить оператор + для векторов так, чтобы стало возможным использование в нашей программе конструкции вида:

...
Vector a, b, c;
...
c = a + b;
...

Здесь Vector – это введеный нами класс. Если мы не сделаем перегрузку операторов, то мы не сможем использовать знак “плюс” для экземпляров нашего класса Vector. Вот как это можно сделать для бинарного (т. е. имеющего два параметра) оператора:

using System;
namespace test
{
    class Vector
    {
        float x, y; //Координаты
        //Конструктор
        public Vector(float x, float y)
        {
            this.x=x;
            this.y=y;
        }
        //Чтение x-координаты
        public float GetX()
        {
            return x;
        }
        //Чтение y-координаты
        public float GetY()
        {
            return y;
        }
        //Перегрузка оператора +
        public static Vector operator +(Vector w, Vector v)
        {
            Vector res = new Vector(w.x + v.x, w.y + v.y);
            return res;
        }
    }
    class Test
    {
        static void Main(string[] args)
        {
            Vector a=new Vector(1, 2), b=new Vector(2, -1), c;
            c = a + b;
            Console.WriteLine("x=" + c.GetX() + ", "
            + "y=" + c.GetY());
        }
    }
}

Код для нашего класса приведен полностью, хотя перегрузка оператора занимает всего несколько строк. Вот они:

...
        public static Vector operator +(Vector w, Vector v)
        {
            Vector res = new Vector(w.x + v.x, w.y + v.y);
            return res;
        }
...

Синтаксис здесь такой – если мы перегружаем оператор op, то мы должны в качестве имени оператора написать operator op (в нашем случае мы перегружаем +, поэтому пишем operator +). Далее, раз это метод, то мы пишем в круглых скобках его параметры. Для бинарного оператора их два (в отдичие от C++, где пареметр – это только правый операнд, левый же передается неявно – через указатель this). У нас они оба имеют тип Vector. Перед operator op пишем тип возвращаемого значения. Так как сумма двух векторов – это опять вектор, то перед именем нашего метода пишем Vector. Модификатор доступа public понятен – без него мы бы не смогли использовать перегруженный оператор вне класса. А вот слово static важно – в C# перегруженные операторы идут как static. Не забывайте его писать.

Внутри перегруженного оператора мы заводим переменную res типа Vector для возврата через нее результата. Ее мы определяем через конструктор с двумя параметрами, который мы ранее написали для нашего класса. Сложение двух векторов происходит так, как и должно происходить – покоординатно.

В классе test мы испытываем наш перегруженный оператор. Все должно работать как и положено, и результат сложения должен вывестись на консоль в виде “x=3, y=1″.


Tags: , , , , , , , ,
Находится в Уроки C# | No Comments »

Ответить

Вы должны быть в системе, дабы комментировать.


C# — язык программирования, сочетающий объектно-ориентированные и аспектно-ориентированные концепции. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как основной язык разработки приложений для платформы Microsoft .NET. Компилятор с C# входит в стандартную установку самой .NET, поэтому программы на нём можно создавать и компилировать даже без инструментальных средств вроде Visual Studio. детский день рождения где C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к С++ и Java. Язык имеет строгую статическую типизацию, поддерживает полиморфизм, перегрузку операторов, указатели на функции-члены классов, атрибуты, события, свойства, исключения, комментарии в формате XML. Переняв многое от своих предшественников — языков С++, Java, Delphi, Модула и Smalltalk — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем: так, C# не поддерживает множественное наследование классов (в отличие от C++).