Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 218 219 220 221 222 223 224 225 226 ... 642

    public void Draw()

    {

      for (int i = 0; i < Height; i++)

      {

        for (int j = 0; j < Width; j++)

        {

          Console.Write("*");

        }

        Console.WriteLine();

      }

    }

    public override string ToString()

      => $"[Width = {Width}; Height = {Height}]";

  }

}

using System;

namespace CustomConversions

{

  public struct Square

  {

    public int Length {get; set;}

    public Square(int l) : this()

    {

      Length = l;

    }

  public void Draw()

    {

      for (int i = 0; i < Length; i++)

      {

        for (int j = 0; j < Length; j++)

        {

          Console.Write("*");

        }

        Console.WriteLine();

      }

    }

    public override string ToString() => $"[Length = {Length}]";

    // Rectangle можно явно преобразовывать в Square.

    public static explicit operator Square(Rectangle r)

    {

      Square s = new Square {Length = r.Height};

      return s;

    }

  }

}

Обратите внимание, что в текущей версии типа Square определена явная операция преобразования. Подобно перегрузке операций процедуры преобразования используют ключевое слово operator в сочетании с ключевым словом explicit или implicit и должны быть определены как static. Входным параметром является сущность, из которой выполняется преобразование, а типом операции — сущность, в которую производится преобразование.

В данном случае предположение заключается в том, что квадрат (будучи геометрической фигурой с четырьмя сторонами равной длины) может быть получен из высоты прямоугольника. Таким образом, вот как преобразовать Rectangle в Square:

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

using System;

using CustomConversions;

Console.WriteLine("***** Fun with Conversions *****n");

// Создать экземпляр Rectangle.

Rectangle r = new Rectangle(15, 4);

Console.WriteLine(r.ToString());

r.Draw();

Console.WriteLine();

// Преобразовать r в Square на основе высоты Rectangle.

Square s = (Square)r;

Console.WriteLine(s.ToString());

s.Draw();

Console.ReadLine();

Ниже показан вывод:

***** Fun with Conversions *****

[Width = 15; Height = 4]

***************

***************

***************

***************

[Length = 4]

****

****

****

****

Хотя преобразование Rectangle в Square в пределах той же самой области действия может быть не особенно полезным, взгляните на следующий метод, который спроектирован для приема параметров типа Square:

// Этот метод требует параметр типа Square.

static void DrawSquare(Square sq)

{

  Console.WriteLine(sq.ToString());

  sq.Draw();

}

Благодаря наличию операции явного преобразования в типе Square методу DrawSquare() на обработку можно передавать типы Rectangle, применяя явное приведение:

...

// Преобразовать Rectangle в Square для вызова метода.

Rectangle rect = new Rectangle(10, 5);

DrawSquare((Square)rect);

Console.ReadLine(); 

Дополнительные явные преобразования для типа Square

Теперь, когда экземпляры Rectangle можно явно преобразовывать в экземпляры Square, давайте рассмотрим несколько дополнительных явных преобразований. Учитывая, что квадрат симметричен по всем сторонам, полезно предусмотреть процедуру преобразования, которая позволит вызывающему коду привести целочисленный тип к типу Square (который, естественно, будет иметь длину стороны, равную переданному целочисленному значению). А что если вы захотите модифицировать еще и Square так, чтобы вызывающий код мог выполнять приведение из Square в int? Вот как выглядит логика вызова:

1 ... 218 219 220 221 222 223 224 225 226 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий