Оператори за преобразуване

Понякога обект от определен клас се изисква да се използва в израз, включително­ съдържащи данни от други видове. В някои случаи за тази цел се оказва

Глава 9. Претоварване на оператора 293

подходящо претоварване на един или повече оператори, а в други случаи - обикновено­ омагьосано преобразуване на типа клас в целевия тип. За ситуации като тази в C #, преди­ има специален вид операторски метод, наречен преобразуващ оператор. Такъв оператор преобразува обект от оригиналния клас в друг тип. Операторите за преобразуване помагат за пълна интеграция на типове класове в програмната среда на C #, което ви позволява свободно да използвате класове заедно с други типове данни, при условие че е определен редът на преобразуване в тези типове.

Има две форми на оператори за преобразуване: явна и неявна. Те са представени по-долу в общи линии:

публичен статичен експлицитен оператор target_type (source_type v)

публичен статичен неявен оператор target_type (source_type v)

където target_type обозначава типа, към който се извършва преобразуването; е­ go_type е типът, който се преобразува; стойност - специфичната стойност, придобита от класа след трансформация. Връщане на оператори за преобразуване­ изпращайте данни, които имат target_type и не е разрешено да се посочват други типове данни за връщане.

Ако операторът за преобразуване е посочен в неявна форма, тогава преобразуването­ Извикването се извиква автоматично, например, когато обект се използва в израз заедно със стойност на целевия тип. Ако операторът за преобразуване е посочен изрично, тогава преобразуването се извиква, когато се извърши глас. За едни и същи типове данни източник и цел не можете да задавате оператора за преобразуване едновременно в явна и неявна форма.

Нека създадем оператор за преобразуване специално за клас ThreeD за обработка­ следете приложението му. Да предположим, че искате да конвертирате обект от тип ThreeD в целочислена стойност, така че да можете да го използвате в цяло число израз. Подобно преобразуване се изисква, по-специално, за да се получи произведението на трите координати на обекта. За тази цел ще използваме следната имплицитна форма на ope­ трансформатор ратор.

публичен статичен имплицитен оператор int (ThreeD op1)

връщане op1.x * op1.y * op1.z;

По-долу има примерна програма, която демонстрира приложението на тази опера­ трансформация на тора.

// Пример за използване на оператора на неявно преобразуване.

// Клас за съхранение на 3D координати.

int x, y, z; // 3D координати

публичен ThreeD (int i, int j, int k)

// Претоварване на двоичен оператор +.

публичен статичен ThreeD оператор + (ThreeD op1, ThreeD op2)

294 Част I. C # Език

Резултат от ThreeD = нов ThreeD);

резултат.x = op1.x + op2.x; резултат.y = op1.y + op2.y; резултат.z = op1.z + op2.z;

// Неявно преобразуване на обект от тип ThreeD в тип int. публичен статичен имплицитен оператор int (ThreeD op1)

връщане op1.x * op1.y * op1.z;

// Показване на координати X, Y, Z. публично празно Покажи ()

Console.WriteLine (x + "," + y + "," + z);

ThreeD a = нов ThreeD (1, 2, 3); ThreeD b = нов ThreeD (10, 10, 10); ThreeD c = нов ThreeD ();

Console.Write ("Координати на точка а:"); шоу ();

Console.WriteLine (); Console.Write ("Координати на точка b:"); b.Show ();

c = a + b; // добавяме координатите на точки a и b Console.Write ("Резултатът от добавяне на a + b:"); в. Покажи ();

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

Глава 9. Претоварване на оператора 295

Резултат от добавяне a + b: 11, 12, 13

Резултатът от заданието i = a: 6

Резултатът от оценката на израза a * 2 - b: -988

Както следва от горния пример на програмата, когато обект от тип ThreeD се използва в цяло число израз като i = a, той се преобразува­ развитие. В този конкретен случай преобразуването води до връщане на цяло число­ стойност 6, която е произведение на координатите на точка а, съхранявани в обекта със същото име. Но ако преобразуването в int не се изисква за оценка на израза, тогава операторът за преобразуване не се извиква. Ето защо операторът метод оператор int () не се извиква при изчисляване на израза c = a + b .

Въпреки това, различни оператори на преобразуване могат да бъдат създадени за различни цели. Например, втори оператор за преобразуване може да бъде дефиниран за преобразуване на обект от тип ThreeD в тип double. Освен това всеки тип трансформация ще се извършва автоматично и независимо от другия.

Операторът на имплицитно преобразуване се прилага автоматично в следните случаи.­ чайове: когато в израз се изисква преобразуване на тип; обект се предава на метода; се извършва присвояване и се извършва изрично привеждане към целевия тип. Като алтернатива можете да създадете изричен оператор за преобразуване, наречен само­ до кога се изпълнява изричен глас. В този случай операторът на изрично преобразуване не се извиква автоматично. Пример е даден по-долу.­ Riant от предишната програма, преработена, за да демонстрира изрично преобразуване­ да въведете int .

// Прилагаме явна трансформация.

// Клас за съхранение на 3D координати. клас ThreeD

int x, y, z; // 3D координати публично ThreeD ()

публичен ThreeD (int i, int j, int k)

// Претоварване на двоичен оператор +.

публичен статичен ThreeD оператор + (ThreeD op1, ThreeD op2)

Резултат от ThreeD = нов ThreeD ();

резултат.x = op1.x + op2.x; резултат.y = op1.y + op2.y; резултат.z = op1.z + op2.z;

// Направете изрично преобразуване на типа този път. публичен статичен експлицитен оператор int (ThreeD op1)

връщане op1.x * op1.y * op1.z;

296 Част I. C # Език

// Показване на координати X, Y, Z. публично празно Покажи ()

Console.WriteLine (x + "," + y + "," + z);

ThreeD a = нов ThreeD (1, 2, 3); ThreeD b = нов ThreeD (10, 10, 10); ThreeD c = нов ThreeD ();

Console.Write ("Координати на точка а:"); шоу ();

Console.WriteLine (); Console.Write ("Координати на точка b:"); b.Show ();

c = a + b; // добавяме координатите на точки a и b Console.Write ("Резултатът от добавяне на a + b:"); в. Покажи ();

i = (int) a; // конвертирате в int изрично,

// тъй като е зададено леене на тип

Console.WriteLine ("Резултат от заданието i = a:" + i); Console.WriteLine ();

i = (int) a * 2 - (int) b; // излишно се изисква леене на тип

Console.WriteLine ("Резултатът от оценката на израза a * 2 - b:" + i);

Операторът на преобразуване вече е изрично посочен и следователно преобразуването­ той трябва да бъде изрично прехвърлен към тип int. Например, следният ред код няма да се компилира, ако кастингът е изключен.

i = (int) a; // конвертирате в int изрично,

// тъй като е зададено леене на тип

Има редица ограничения, наложени на операторите за преобразуване:.

• Изходният или целевият тип преобразуване трябва да бъде от класа, за който­ Тази трансформация е декларирана. По-специално, не можете да замените преобразуване в тип int, ако първоначално е посочено като преобразуване в тип double .

• Не можете да посочите преобразуване в обекта на класа или от този клас.

• За едни и същи типове данни източник и цел не можете да посочите едни и същи­ временно изрично и имплицитно преобразуване.