Перегрузка операторов и преобразования типов (C#)

Примеры перегрузки операторов

В данной рассматриваем примеры перегрузки операторов + и — в языке C#. Таким же образом можно перегрузить другие операторы, которые принимают два параметра.

Так же показываю как задать инструкцию явного преобразования типов из одного созданного класса в другой.

В коде ниже создано 2 класса: Vector и Coord. В классе Vector перегружены два бинарных оператора + и -.

В классе Coord объявлены только конструктор и два свойства X, Y, обозначающие координату.

С помощью инструкции public static explicit operator Coord(Vector v)  мы можем задать правило преобразования объекта класса Vector в объект класса Coord:

using System.IO;
using System;
using System.Text;

class Coord
{
  public int X {get;set;}
  public int Y {get;set;}
  
  public Coord(int x, int y)
  {
      this.X = x;
      this.Y = y;
  }
  
  public override string ToString()
  {
      return String.Format("Coord: X = {0}, Y = {1}", this.X, this.Y);
  }
}

class Vector
{
    //Объвляем автосвойства, чтобы не использовать public поля
  public int X {get;set;}
  public int Y {get;set;}

  public Vector(int x, int y)
  {
    this.X = x;
    this.Y = y;
  }

    //Оператор + принимает на вход 2 параметра
  public static Vector operator+(Vector v1, Vector v2)
  {
    return new Vector(v1.X + v2.X, v1.Y + v2.Y);
  }

    //Оператор - принимает на вход 2 параметра
  public static Vector operator-(Vector v1, Vector v2)
  {
    return new Vector(v1.X - v2.X, v1.Y - v2.Y);
  }

    //Переопределение метода ToString()
    public override string ToString()
    {
        return String.Format("Vector: X = {0}, Y = {1}", this.X, this.Y);
    }
    
    //Инструкция по явному преобразованию класса Vector в класс Coord
    //Вместо explicit можно написать implicit, тогда преобразование можно
    //будет делать неявным
    public static explicit operator Coord(Vector v)
    {
        return new Coord(v.X, v.Y);
    }
  
}

class Program
{
  static void Main()
  {
    Console.WriteLine("Start program.");
    Vector v1 = new Vector(10,20);
    Vector v2 = new Vector(15,50);
    Console.WriteLine(v1+v2);
    Console.WriteLine(v1-v2);
    //----------------------
    Coord c1 = new Coord(100,200);
    Console.WriteLine(c1); //Явное преобразование Vector в Coord
    Coord c2 = (Coord)(v1+v2);
    Console.WriteLine(c2);
  }
}

Результат работы программы:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *