C# 4.0 полное руководство - 2011
Шрифт:
Если оператор преобразования указан в неявной форме (implicit), то преобразование вызывается автоматически, например, в том случае, когда объект используется в выражении вместе со значением целевого типа. Если же оператор преобразования указан в явной форме (explicit), то преобразование вызывается в том случае, когда выполняется приведение типов. Для одних и тех же исходных и целевых типов данных нельзя указывать оператор преобразования одновременно в явной и неявной форме.
Создадим
public static implicit operator int(ThreeD opl)
{
return opl.x * opl.у * opl.z;
}
Ниже приведен пример программы, демонстрирующей применение этого оператора преобразования.
// Пример применения оператора неявного преобразования, using System;
// Класс для хранения трехмерных координат, class ThreeD {
int х, у, z; // трехмерные координаты
public ThreeD { х = у = z = 0; }
public ThreeD(int i, int j, int k) { x = i; у = j; z = k; }
// Перегрузить бинарный оператор +.
public static ThreeD operator +(ThreeD opl, ThreeD op2)
{
ThreeD result = new ThreeD;
result.x = opl.x + op2.x;
result.у = opl.y + op2.y;
result.z = opl.z + op2.z;
return result;
}
// Неявное преобразование объекта типа ThreeD к типу int. public static implicit operator int(ThreeD opl)
{
return opl.x * opl.y * opl.z;
}
// Вывести координаты X, Y, Z. public void Show
{
Console.WriteLine(x + ", " + у + ", " + z) ;
}
}
class ThreeDDemo { static void Main {
ThreeD a = new ThreeD(1, 2, 3);
ThreeD b = new ThreeD(10, 10, 10);
ThreeD с = new ThreeD; int i;
Console.Write("Координаты точки a: ");
a.Show;
Console.WriteLine ;
Console.Write("Координаты точки b: ");
b.Show;
Console.WriteLine;
с = a + b; // сложить координаты точек а и b Console.Write("Результат сложения a + b: ");
c.Show ;
Console.WriteLine; i = a; //
Console.WriteLine("Результат присваивания i = a: " + i) ; Console.WriteLine;
i=a*2-b; // преобразовать в тип int
Console.WriteLine("Результат вычисления выражения a * 2 -
}
}
Вот к какому результату приводит выполнение этой программы.
Координаты точки а: 1, 2, 3
Координаты точки Ь: 10, 10, 10
Результат сложения а+Ь: 11, 12, 13 Результат присваивания i = а: 6
Результат вычисления выражения а * 2 - Ь: -988
Как следует из приведенного выше примера программы, когда объект типа ThreeD используется в таком целочисленном выражении, как i = а, происходит его преобразование. В этом конкретном случае преобразование приводит к возврату целого значения 6, которое является произведением координат точки а, хранящихся в объекте того же названия. Но если для вычисления выражения преобразование в тип int не требуется, то оператор преобразования не вызывается. Именно поэтому операторный метод operator int не вызывается при вычислении выражения с = а + Ь.
Но для различных целей можно создать разные операторы преобразования. Так, для преобразования объекта типа ThreeD в тип double можно было бы определить второй оператор преобразования. При этом каждый вид преобразования выполнялся бы автоматически и независимо от другого.
Оператор неявного преобразования применяется автоматически в следующих случаях: когда в выражении требуется преобразование типов; методу передается объект; осуществляется присваивание и производится явное приведение к целевому типу. С другой стороны, можно создать оператор явного преобразования, вызываемый только тогда, когда производится явное приведение типов. В таком случае оператор явного преобразования не вызывается автоматически. В качестве примера ниже приведен вариант предыдущей программы, переделанный для демонстрации явного преобразования в тип int.
// Применить явное преобразование, using System;
// Класс для хранения трехмерных координат, class ThreeD {
int х, у, z; // трехмерные координаты public ThreeD { х = у = z = 0; }
public ThreeD(int i, int j, int k) { x = i; у = j; z = k; }
// Перегрузить бинарный оператор +.
public static ThreeD operator +(ThreeD opl, ThreeD op2)
{