Добавить в цитаты Настройки чтения

Страница 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 + &quot;, &quot; + y + &quot;, &quot; + 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(&quot;Координаты точки a: &quot;);</b>

<b>    a.Show();</b>

<b>    Console.WriteLine();</b>

<b>    Console.Write(&quot;Координаты точки b: &quot;);</b>

<b>    b.Show();</b>

<b>    Console.WriteLine();</b>

<b>    c = a + b; // сложить координаты точек а и b </b>

<b>    Console.Write(&quot;Результат сложения a + b: &quot;);</b>

<b>    c.Show();</b>

<b>    Console.WriteLine();</b>

<b>    i = a; // преобразовать в тип int</b>

<b>    Console.WriteLine(&quot;Результат присваивания i = a: &quot; + i);</b>

<b>    Console.WriteLine();</b>

<b>    i = a * 2 - b; // преобразовать в тип int</b>

<b>    Console.WriteLine(&quot;Результат вычисления выражения a * 2 - b &quot; + 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>