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