Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » Полное руководство. С# 4.0 - Шилдт Герберт

Полное руководство. С# 4.0 - Шилдт Герберт

Читать онлайн Полное руководство. С# 4.0 - Шилдт Герберт

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 58 59 60 61 62 63 64 65 66 ... 188
Перейти на страницу:

Описанный выше способ применения укороченных логических операторов можетпоказаться, на первый взгляд, несколько запутанным, но если подумать, то в такомприменении обнаруживается известный практический смысл. Ведь благодаря перегрузке операторов true и false для класса компилятор получает разрешение наприменение укороченных логических операторов, не прибегая к явной их перегрузке.Это дает также возможность использовать объекты в условных выражениях. И вообще,логические операторы & и | лучше всего реализовывать полностью, если, конечно, нетребуется очень узко направленная их реализация.Операторы преобразования

Иногда объект определенного класса требуется использовать в выражении, включающем в себя данные других типов. В одних случаях для этой цели оказываетсяпригодной перегрузка одного иди более операторов, а в других случаях — обыкновенное преобразование типа класса в целевой тип. Для подобных ситуаций в C# предусмотрена специальная разновидность операторного метода, называемая операторомпреобразования. Такой оператор преобразует объект исходного класса в другой тип.Операторы преобразования помогают полностью интегрировать типы классов в средупрограммирования на С#, разрешая свободно пользоваться классами вместе с другимитипами данных, при условии, что определен порядок преобразования в эти типы.

Существуют две формы операторов преобразования: явная и неявная. Ниже онипредставлены в общем виде:public static explicit operator целевой_тип(исходный_тип v) {return значение;}public static implicit operator целевой_тип(исходный_тип v) {return значение;}

где целевойтип обозначает тот тип, в который выполняется преобразование; исходныйтип — тот тип, который преобразуется; значение — конкретное значение,приобретаемое классом после преобразования. Операторы преобразования возвращают данные, имеющие целевой_тип, причем указывать другие возвращаемые типыданных не разрешается.

Если оператор преобразования указан в неявной форме (implicit), то преобразование вызывается автоматически, например, в том случае, когда объект используетсяв выражении вместе со значением целевого типа. Если же оператор преобразованияуказан в явной форме (explicit), то преобразование вызывается в том случае, когдавыполняется приведение типов. Для одних и тех же исходных и целевых типов данныхнельзя указывать оператор преобразования одновременно в явной и неявной форме.

Создадим оператор преобразования специально для класса ThreeD, чтобы продемонстрировать его применение. Допустим, что требуется преобразовать объект типаThreeD в целое значение, чтобы затем использовать его в целочисленном выражении.Такое преобразование требуется, в частности, для получения произведения всех трехкоординат объекта. С этой целью мы воспользуемся следующей неявной формой оператора преобразования.public static implicit operator int(ThreeD op1){ return op1.x * op1.y * op1.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 op1, ThreeD op2) { ThreeD result = new ThreeD); result.x = op1.x + op2.x; result.у = op1.у + op2.y; result.z = op1.z + op2.z; return result; } // Неявное преобразование объекта типа ThreeD к типу int. public static implicit operator int(ThreeD op1) { return op1.x * op1.у * op1.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; // преобразовать в тип int Console.WriteLine("Результат присваивания i = a: " + i); Console.WriteLine(); i = a * 2 - b; // преобразовать в тип int Console.WriteLine("Результат вычисления выражения a * 2 - b: " + i }}

Вот к какому результату приводит выполнение этой программы.Координаты точки а: 1, 2, 3Координаты точки b: 10, 10, 10Результат сложения а + b: 11, 12, 13Результат присваивания i = а: 6Результат вычисления выражения а * 2 - b: -988

Как следует из приведенного выше примера программы, когда объект типа ThreeDиспользуется в таком целочисленном выражении, как i = а, происходит его преобразование. В этом конкретном случае преобразование приводит к возврату целого значения 6, которое является произведением координат точки а, хранящихся в объектетого же названия. Но если для вычисления выражения преобразование в тип int нетребуется, то оператор преобразования не вызывается. Именно поэтому операторныйметод operator int() не вызывается при вычислении выражения с = а + b.

Но для различных целей можно создать разные операторы преобразования. Так,для преобразования объекта типа 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 op1, ThreeD op2) { ThreeD result = new ThreeD(); result.x = op1.x + op2.x; result.у = op1.y + op2.y; result.z = op1.z + op2.z; return result; } // Выполнить на этот раз явное преобразование типов. public static explicit operator int(ThreeD op1) { return op1.x * op1.y * op1.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 = (int) a; // преобразовать в тип int явно, // поскольку указано приведение типов Console.WriteLine("Результат присваивания i = а: " + i); Console.WriteLine(); i = (int)a * 2 - (int)b; // явно требуется приведение типов Console.WriteLine("Результат вычисления выражения а * 2 - b: " + i); }}

Оператор преобразования теперь указан в явной форме, и поэтому преобразование должно быть явно приведено к типу int. Например, следующая строка кода небудет скомпилирована, если исключить приведение типов.i = (int) а; // преобразовать в тип int явно,// поскольку указано приведение типов

На операторы преобразования накладывается ряд следующих ограничений.

Исходный или целевой тип преобразования должен относиться к классу, для которого объявлено данное преобразование. В частности, нельзя переопределить преобразование в тип int, если оно первоначально указано как преобразование в тип double.

1 ... 58 59 60 61 62 63 64 65 66 ... 188
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Полное руководство. С# 4.0 - Шилдт Герберт.
Комментарии