Оператори за преобразуване
Понякога обект от определен клас се изисква да се използва в израз, включително съдържащи данни от други видове. В някои случаи за тази цел се оказва
Глава 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 .
• Не можете да посочите преобразуване в обекта на класа или от този клас.
• За едни и същи типове данни източник и цел не можете да посочите едни и същи временно изрично и имплицитно преобразуване.
- Операторът на ефирната кабелна телевизия "Космос-ТВ" изключи MTV канала, Информация и справка
- Деактивиране на услуги - как да деактивирате платени услуги на оператори, интернет, абонаменти, промяна на тарифата
- Обратният оператор е
- Лазерно избелване на зъби - предимства на метода
- Онлайн прием - Начало, Онлайн прием, Плащане на субсидии