Operatorlarni qayta yuklash Operatorlarni qayta yuklash-fayllar.org

Operatorlarni qayta yuklash
Operatorlarni qayta yuklash
C# dasturlash tilida operatorlani biror belgilangan vazifa bo’yicha sinflarda qayta aniqlash imkoniyati mavjud. Bu jarayonni operatorlarni qayta yuklash deyiladi. Operatorlarni qayta yuklash imkoniyati sinflarda operatorlarning qo’llanilishini yanada kengaytiradi. Misol uchun ‘+’ operatori sonlarni qiymatini qo’shishni, ikkita satrni biriktirishni bajaradi, lekin ikkita sonli massivni mos elementlarini qo’shishni bajara olmaydi. Buning uchun massivlarning elementlarini bir-biriga qo’shishni mos ravishda sinfda ‘+’ operatorini qayta aniqlab bajarish mumkin. Operatorlarni unar va binar operatorlarga ajratish mumkin. Unar operatorlar bitta operand bilan, binar operatorlar ikkita operand bilan qo’llaniladi
Sinflar va tuzilmalardagi usullar bilan bir qatorda biz operatorlarni ham aniqlashimiz va ortiqcha yuklashimiz mumkin. Masalan, bizda quyidagi Counter klassi bor
class Counter
{
public int Value { get; set; }
}
Bu sinf ba'zi hisoblagichni ifodalaydi, uning qiymati Value xususiyatida saqlanadi.
Aytaylik, bizda Counter sinfining ikkita ob'ekti bor - standart taqqoslash va qo'shish operatsiyalari yordamida Value xususiyatiga qarab solishtirmoqchi yoki qo'shmoqchi bo'lgan ikkita hisoblagich:
Counter counter1 = new Counter { Value = 23 };
Counter counter2 = new Counter { Value = 45 };
bool result = counter1 > counter2;
Counter c3 = counter1 + counter2;
Ammo hozirda Counter ob'ektlari uchun na taqqoslash operatsiyasi, na qo'shish amali mavjud emas. Bu operatsiyalar bir qator ibtidoiy turlarda qo'llanilishi mumkin. Masalan, sukut bo'yicha biz raqamli qiymatlarni qo'shishimiz mumkin, ammo kompilyator murakkab turdagi ob'ektlarni - sinflar va tuzilmalarni qanday qo'shishni bilmaydi. Va buning uchun bizga kerak bo'lgan operatorlarni ortiqcha yuklashimiz kerak.
Operatorni haddan tashqari yuklash biz ob'ektlari uchun operatorni aniqlamoqchi bo'lgan sinfda maxsus usulni aniqlashdan iborat:
public static возвращаемый_тип operator оператор(параметры)
{ }
Ushbu usulda umumiy statik modifikatorlar bo'lishi kerak, chunki haddan tashqari yuklangan operator ushbu sinfning barcha ob'ektlari uchun ishlatiladi. Keyin qaytish turining nomi keladi. Qaytish turi biz ob'yektlarni olmoqchi bo'lgan turni ifodalaydi. Masalan, ikkita Counter ob'ektini qo'shish orqali biz yangi Counter ob'ektini olishni kutamiz. Va ikkalasini solishtirish natijasida biz bool tipidagi ob'ektni olishni xohlaymiz, bu shartli ifodaning to'g'ri yoki noto'g'ri ekanligini ko'rsatadi. Ammo vazifaga qarab, qaytarish turlari har qanday bo'lishi mumkin.
So'ngra usul nomi o'rniga operator kalit so'zi va operatorning o'zi mavjud. Va keyin parametrlar qavs ichida keltirilgan. Binar operatorlar ikkita parametrni, unarli operatorlar bitta parametrni oladi. Va har qanday holatda, parametrlardan biri operator aniqlangan turni - sinf yoki tuzilmani ifodalashi kerak.
class Counter
{
public int Value { get; set; }
public static Counter operator +(Counter counter1, Counter counter2)
{
return new Counter { Value = counter1.Value + counter2.Value };
}
public static bool operator >(Counter counter1, Counter counter2)
{
return counter1.Value > counter2.Value;
}
public static bool operator <(Counter counter1, Counter counter2)
{
return counter1.Value < counter2.Value;
}
}
Barcha haddan tashqari yuklangan operatorlar ikkilik bo'lgani uchun - ya'ni ular ikkita ob'ektda amalga oshiriladi, har bir ortiqcha yuk uchun ikkita parametr mavjud.
Qo'shish amalida biz Counter sinfining ikkita ob'ektini qo'shmoqchi bo'lganimiz sababli, operator ushbu sinfning ikkita ob'ektini qabul qiladi. Va biz qo'shish natijasida yangi Counter ob'ektini olishni xohlayotganimiz sababli, bu sinf qaytish turi sifatida ham qo'llaniladi. Ushbu operatorning barcha harakatlari Value xususiyati ikkala parametrning Value xususiyatining qiymatlarini birlashtirgan yangi ob'ektni yaratishga to'g'ri keladi:
public static Counter operator +(Counter counter1, Counter counter2)
{
return new Counter { Value = counter1.Value + counter2.Value };
}
Ikki taqqoslash operatori ham qayta aniqlandi. Agar biz ushbu taqqoslash operatorlaridan birini qayta belgilasak, u holda ushbu taqqoslash operatorlarining ikkinchisini ham qayta belgilashimiz kerak. Taqqoslash operatorlarining o'zlari Value xususiyatlarining qiymatlarini solishtiradilar va taqqoslash natijasiga qarab, rost yoki noto'g'ri qiymatlarni qaytaradilar.
Endi dasturda haddan tashqari yuklangan operatorlardan foydalanamiz:
Counter counter1 = new Counter { Value = 23 };
Counter counter2 = new Counter { Value = 45 };
bool result = counter1 > counter2;
Console.WriteLine(result); // false
Counter counter3 = counter1 + counter2;
Console.WriteLine(counter3.Value); // 23 + 45 = 68
Shuni ta'kidlash kerakki, operator ta'rifi mohiyatan usul bo'lganligi sababli, biz bu usulni ortiqcha yuklashimiz mumkin, ya'ni uning uchun boshqa versiyani yaratishimiz mumkin. Masalan, Counter sinfiga boshqa operator qo'shamiz:
public static int operator +(Counter counter1, int val)
{
return counter1.Value + val;
}
Bu usul Value xususiyatining qiymatini va ba'zi sonlarni qo'shib, ularning summasini qaytaradi. Shuningdek, biz ushbu operatorni qo'llashimiz mumkin:
Counter counter1 = new Counter { Value = 23 };
int result = counter1 + 27; // 50
Console.WriteLine(result);
Operatorlarni ortiqcha yuklaganda, barcha operatorlarni ortiqcha yuklash mumkin emasligini yodda tuting. Xususan, biz quyidagi operatorlarni ortiqcha yuklashimiz mumkin:
birlik operatorlar +x, -x, !x, ~x, ++, --, true, false
ikkilik operatorlar +, -, *, /, %
taqqoslash operatorlari ==, !=, <, >, <=, >=
bitli operatorlar &, |, ^, <<, >>
mantiqiy operatorlar &&, ||
http://fayllar.org
|