Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч
Перегрузка операторов преобразования
Download 2.46 Mb.
|
Язык программирования C#
8.3. Перегрузка операторов преобразования
Операторы преобразования позволяют приводить один тип к другому. Различают явное и неявное преобразование типов. Явное преобразование не требует никаких операторов и проходит незаметно от программиста, неявное требует для себя оператора “()”. Именно благодаря операторам преобразования возможен следующий код. double d; int i = 5; d = i; d = 3.5; i = (int)d; Лист. 8.14 Сначала здесь используется неявное, а затем явное преобразование. Помимо преобразований между стандартными типами программист может определить свои собственные преобразования для создаваемых им классов. Общий формат для перегрузки оператора неявного преобразования имеет следующий вид: public static implicit operator тип0(тип1 параметр1) { тело оператора } Общий формат для перегрузки оператора явного преобразования имеет следующий вид public static explicit operator тип0(тип1 параметр) { тело оператора } В этой схеме: тип0 – тип к которому преобразуем, тип1 – тип который преобразуем, параметр – имя формального параметра. Один из типов либо тип0, либо тип1 должен совпадать и именем класса, в котором перегружен оператор. Нельзя преобразовывать из типа void и к типу void. Нельзя сделать одно и тоже преобразование явным и неявным. Добавим в класс Vector (Лист. 8.12) два преобразования одно неявное к массиву типа double[] и одно явное к массиву типа int[]. // неявное преобразование к double[] public static implicit operator double[](Vector Source) { double[] Result = new double[Source.TheVector.Length]; for (int i = 0; i < Source.TheVector.Length; i++) Result[i] = Source.TheVector[i]; return Result; } // неявное преобразование к int[] public static explicit operator int[](Vector Source) { int[] Result = new int[Source.TheVector.Length]; for (int i = 0; i < Source.TheVector.Length; i++) Result[i] = unchecked((int )Source.TheVector[i]); return Result; } Лист. 8.15 В представленном листинге неявное преобразование просто возвращает копию поля TheVector, а явное отсекает от элементов массива TheVector дробную часть и возвращает массив int[]. Для преобразований используются стандартные преобразования, определенные для типа double. Для тестирования этих операторов добавим в конец функции Main класса Program (Лист. 8.13) следующий код. Vector vector2 = new Vector(10); for (int i = 0; i < 10; i++) vector2.TheVector[i] = Math.Sqrt(i); Console.Write("vector2 = "); vector2.Show(); double[] dvector2 = vector2; Console.Write("dvector2 = ("); for (int i = 0; i < 9; i++) Console.Write(dvector2[i] + ","); Console.Write(dvector2[9]); Console.Write(")\n\n"); int[] ivector2 = (int[])vector2; Console.Write("ivector2 = ("); for (int i = 0; i < 9; i++) Console.Write(ivector2[i] + ","); Console.Write(ivector2[9]); Console.Write(")\n\n"); Лист. 8.16 В этом фрагменте кода создается объект класса Vector vector2, затем этот в цикле поле объект инициализируется корнями чисел от 0 до 9. После этого объект vector2 сначала приводится к массиву double[], а затем к массиву int[], сразу после приведений эти массивы выводятся. Вывод кода дополняет Вывод. 8.4 следующими строками: vector2 = (0,1,1,4142135623731,1,73205080756888,2,2,23606797749979,2,44948974278 318,2,64575131106459,2,82842712474619,3) dvector2 = (0,1,1,4142135623731,1,73205080756888,2,2,23606797749979,2,4494897427 8318,2,64575131106459,2,82842712474619,3) ivector2 = (0,1,1,1,2,2,2,2,2,3) Вывод. 8.6 Download 2.46 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling