Методы операторов преобразования
Время от времени возникает необходимость в преобразовании объекта одного типа
в объект другого типа. Уверен, что вам приходилось преобразовывать значение
Byte
в
Int32
. Когда исходный и целевой типы являются примитивными, компилятор
способен без посторонней помощи генерировать код, необходимый для преобра-
зования объекта.
Если ни один из типов не является примитивным, компилятор генерирует код,
заставляющий CLR выполнить преобразование (приведение типов). В этом слу-
чае CLR просто проверяет, совпадает ли тип исходного объекта с целевым типом
(или является производным от целевого). Однако иногда требуется преобразовать
231
Методы.операторов.преобразования
объект одного типа в совершенно другой тип. Например, класс
System.Xml.Linq.
XElement
позволяет преобразовать элемент XML в
Boolean
, (
U
)
Int32
, (
U
)
Int64
,
Single
,
Double
,
Decimal
,
String
,
DateTime
,
DateTimeOffset
,
TimeSpan
,
Guid
или
эквивалент любого из этих типов, допускающий присваивание
null
(кроме
String
).
Также можно представить, что в FCL есть тип данных
Rational
, в который удобно
преобразовывать объекты типа
Int32
или
Single
. Более того, было бы полезно
иметь возможность выполнить обратное преобразование объекта
Rational
в
Int32
или
Single
.
Для выполнения этих преобразований в типе
Rational
должны определяться
открытые конструкторы, принимающие в качестве единственного параметра экзем-
пляр преобразуемого типа. Кроме того, нужно определить открытый экземплярный
метод
ToXxx
, не принимающий параметров (как популярный метод
ToString
).
Каждый такой метод преобразует экземпляр типа, в котором определен этот метод,
в экземпляр типа
Xxx
. Вот как правильно определить соответствующие конструк-
торы и методы для типа
Rational
:
public sealed class Rational {
// Создает Rational из Int32
public Rational(Int32 num) { ... }
// Создает Rational из Single
public Rational(Single num) { ... }
// Преобразует Rational в Int32
public Int32 ToInt32() { ... }
// Преобразует Rational в Single
public Single ToSingle() { ... }
}
Вызывая эти конструкторы и методы, разработчик, используя любой язык, может
преобразовать объект типа
Int32
или
Single
в
Rational
и обратно. Подобные пре-
образования могут быть весьма удобны, и при проектировании типа стоит подумать,
какие конструкторы и методы преобразования имело бы смысл включить в него.
Ранее мы обсуждали способы поддержки перегрузки операторов в разных языках.
Некоторые (например, C#) наряду с этим поддерживают перегрузку
операторов
преобразования
— методы, преобразующие объекты одного типа в объекты другого
типа. Методы операторов преобразования определяются при помощи специального
синтаксиса. Спецификация CLR требует, чтобы перегруженные методы преоб-
разования были открытыми и статическими. Кроме того, C# (и многие другие
языки) требуют, чтобы у метода преобразования тип, по крайней мере, одного из
параметров или возвращаемого значения совпадал с типом, в котором определен
операторный метод. Причина этого ограничения в том, что оно позволяет ком-
пилятору C# в разумное время находить кандидатуры операторных методов для
привязки. Следующий код добавляет в тип
Rational
четыре метода операторов
преобразования:
232
Do'stlaringiz bilan baham: |