Читаем Язык программирования C#9 и платформа .NET5 полностью

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


...

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

Rectangle rect = new Rectangle(10, 5);

DrawSquare((Square)rect);

Console.ReadLine; 

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

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


...

// Преобразование int в Square.

Square sq2 = (Square)90;

Console.WriteLine("sq2 = {0}", sq2);


// Преобразование Square в int.

int side = (int)sq2;

Console.WriteLine("Side length of sq2 = {0}", side);

Console.ReadLine;


Ниже показаны изменения, внесенные в структуру Square:


public struct Square

{

  ...

  public static explicit operator Square(int sideLength)

  {

    Square newSq = new Square {Length = sideLength};

    return newSq;

  }


  public static explicit operator int (Square s) => s.Length;

}


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

Таким образом, как и с перегрузкой операций, возможность создания операции явного приведения для заданного типа вовсе не означает необходимость ее создания. Обычно этот прием будет наиболее полезным при создании типов структур, учитывая, что они не могут принимать участие в классическом наследовании (где приведение обеспечивается автоматически). 

Определение процедур неявного преобразования

До сих пор мы создавали различные специальные операции явного преобразования. Но что насчет следующего неявного преобразования?


...

Square s3 = new Square {Length = 83};


// Попытка сделать неявное приведение?

Rectangle rect2 = s3;


Console.ReadLine;


Данный код не скомпилируется, т.к. вы не предоставили процедуру неявного преобразования для типа Rectangle. Ловушка здесь вот в чем: определять одновременно функции явного и неявного преобразования не разрешено, если они не различаются по типу возвращаемого значения или по списку параметров. Это может показаться ограничением; однако вторая ловушка связана с тем, что когда тип определяет процедуру неявного преобразования, то вызывающий код вполне законно может использовать синтаксис явного приведения!

Запутались? Чтобы прояснить ситуацию, давайте добавим к структуре Rectangle процедуру неявного преобразования с применением ключевого слова implicit (обратите внимание, что в показанном ниже коде предполагается, что ширина результирующего прямоугольника вычисляется умножением стороны квадрата на 2):


public struct Rectangle

{

  ...

  public static implicit operator Rectangle(Square s)

  {

    Rectangle r = new Rectangle

    {

      Height = s.Length,

      Width = s.Length * 2 // Предположим, что ширина нового

                           // квадрата будет равна (Length х 2)..

    };

    return r;

  }

}


После такой модификации можно выполнять преобразование между типами:


...

//  Неявное преобразование работает!

Square s3 = new Square { Length= 7};


Rectangle rect2 = s3;

Console.WriteLine("rect2 = {0}", rect2);


Перейти на страницу:

Похожие книги

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT