Язык программирования C#9 и платформа .NET5
Часть 222 из 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;}}}Обратите внимание, что в текущей версии типа
определена явная операция преобразования. Подобно перегрузке операций процедуры преобразования используют ключевое слово operator в сочетании с ключевым словомSquareилиexplicitи должны быть определены какimplicit. Входным параметром является сущность, из которой выполняется преобразование, а типом операции — сущность, в которую производится преобразование.staticВ данном случае предположение заключается в том, что квадрат (будучи геометрической фигурой с четырьмя сторонами равной длины) может быть получен из высоты прямоугольника. Таким образом, вот как преобразовать
вRectangle:Squareusing 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