Преобразования типов класса

Преобразования типов класса

Как показано в главе 4, типы класса могут быть связаны классическим отношением наследования (отношение "is-a"). В этом случае в C# процесс преобразования позволяет сдвигаться вверх или вниз по иерархии классов. Например, производный класс всегда можно неявно преобразовать в базовый тип. Однако если вы захотите сохранить базовый тип класса в производной переменной, придется выполнить явное преобразование.

// Два связанных типа класса.

class Base{}

class Derived: Base{}

class Program {

 static void Main() {

  // Неявное преобразование из производного в базовый.

  Base myBaseType;

  myBaseType = new Derived();

  // Для сохранения базовой ссылки в производном типе

  // следует выполнить явное преобразование.

  Derived myDerivedType = (Derived)myBaseType;

 }

}

Здесь явное преобразование работает благодаря тому, что классы Base и Derived связаны классическим отношением наследования. Но что делать в том случае, когда вы хотите связать преобразованием два типа класса, принадлежащие разным иерархиям? Если классы не связаны классическим наследованием, явное преобразование помочь ничем не сможет.

В соответствующем ключе рассмотрим типы, характеризуемые значениями. Предположим, что у нас есть две .NET-структуры с именами Square (квадрат) и Rectangle (прямоугольник). Поскольку структуры не могут использовать классическое наследование, нет и естественного способа взаимного преобразования этих явно связанных типов (в предположении о том, что такое преобразование имеет смысл).

Конечно, проблему можно решить с помощью создания в этих в структурах вспомогательных методов (например, Rectangle.ToSquare()), но в C# можно создавать пользовательские подпрограммы преобразования, позволяющие соответствующим типам по-своему отвечать на операцию (). Так, при правильной конфигурации типа Square вы получите возможность использовать следующий синтаксис для явного преобразования этих типов структуры.

// Превращение прямоугольника в квадрат.

Rectangle rect;

rect.Width = 3;

rect.Height = 10;

Square sq = (Square)rect;

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Пользовательские преобразования типов

Из книги Язык программирования С# 2005 и платформа .NET 2.0. [3-е издание] автора Троелсен Эндрю

Пользовательские преобразования типов Рассмотрим тему, близко связанную с перегрузкой операций: это пользовательские правила преобразования типов. В начале вашего рассмотрения мы кратко обсудим явные и неявные преобразования числовых данных и соответствующих типов


Определение типов класса

Из книги Советы по Delphi. Версия 1.0.6 автора Озеров Валентин

Определение типов класса Пустые пространства имен не представляют собой большого интереса, поэтому давайте выясним, как в CIL определяется тип класса. Вполне логично, что для этого используется директива .class. Однако эта простая директива может иметь множество


Преобразования

Из книги Стандарты программирования на С++. 101 правило и рекомендация автора Александреску Андрей


29. Используйте перегрузку, чтобы избежать неявного преобразования типов

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

29. Используйте перегрузку, чтобы избежать неявного преобразования типов РезюмеНе приумножайте объекты сверх необходимости (Бритва Оккама): неявное преобразование типов обеспечивает определенное синтаксическое удобство (однако см. рекомендацию 40), но в ситуации, когда


Преобразования CSS

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Преобразования CSS В главе 22, ведя разговор о канве и программном рисовании на ней, мы узнали о преобразованиях системы координат. С помощью особых расширений CSS мы можем проделать аналогичные действия над любым элементом Web-страницы: сместить его, повернуть, растянуть или


Таблица преобразования типов

Из книги Macromedia Flash Professional 8. Графика и анимация автора Дронов В. А.

Таблица преобразования типов Для удобства использования все взаимные преобразования типов сведены в одну таблицу (табл. 3.2).Таблица 3.2. Взаимные преобразования типов данных XSLT Преобразовываемый тип Целевой тип boolean (булевое значение) number (число) string (строка) node-set


Преобразования типов

Из книги Фундаментальные алгоритмы и структуры данных в Delphi автора Бакнелл Джулиан М.

Преобразования типов Преобразование типов производится либо неявно, например при преобразовании по умолчанию или в процессе присваивания, либо явно, путем выполнения операции приведения типа. Преобразование типов выполняется также, когда преобразуется значение,


Преобразования типов при присваивании

Из книги C++ для начинающих автора Липпман Стенли

Преобразования типов при присваивании В операциях присваивания тип значения, которое присваивается, преобразуется к типу переменной, получающей это значение. Преобразования при присваивании допускаются даже в тех случаях, когда они влекут за собой потерю


Явные преобразования типов

Из книги автора

Явные преобразования типов Явное преобразование типа может быть выполнено посредством операции приведения типа. Она имеет следующую синтаксическую форму(<абстрактное-имя-типа>) <операнд><абстрактное-имя-типа> — специфицирует некоторый тип; <операнд> —


Преобразования типов при вызовах функций

Из книги автора

Преобразования типов при вызовах функций Метод преобразования аргументов функция при ее вызове зависит от того, имеется ли предварительное объявление данной функции, содержащее список типов ее аргументов.Если предварительное объявление имеется, и оно содержит список


Преобразования

Из книги автора

Преобразования Преобразований, предусматриваемых Flash, всего два. Однако с их помощью можно задать весьма сложное движение выделенного нами фрагмента


Осторожность в отношении автоматического преобразования типов

Из книги автора

Осторожность в отношении автоматического преобразования типов Часто мы используем совместно символы и строки, не обращая на это никакого внимания. Преобразованием типов занимается компилятор, и программист зачастую не подозревает, что происходит на самом деле.


4.14. Преобразования типов

Из книги автора

4.14. Преобразования типов Представим себе следующий оператор присваивания:int ival = 0;// обычно компилируется с предупреждениемival = 3.541 + 3;В результате ival получит значение 6. Вот что происходит: мы складываем литералы разных типов – 3.541 типа double и 3 типа int. C++ не может