27-Mavzu: Operatorlarni qayta yuklash. Qayta yuklash qoidalari. Unar va
biran amallarni qayta yuklash xususiyatlari.
Reja:
1. Operatorlarni qayta yuklash.
2. Qayta yuklash qoidalari.
3. Unar va biran amallarni qayta yuklash xususiyatlari.
Usullar bilan bir qatorda biz operatorlarni ortiqcha yuklashimiz ham mumkin.
Masalan, bizda quyidagi Counter klassi bor deylik:
class
Counter
{
public
int
Value {
get
;
set
; }
}
Ushbu sinf ba'zi bir hisoblagichlarni ifodalaydi, ularning qiymati Value xususiyatida
saqlanadi.
Aytaylik, bizda hisoblagich sinfining ikkita ob'ekti bor - biz ularni solishtirish yoki
qo'shish istagan ikkita hisoblagichni Value xususiyati asosida standart taqqoslash va
qo'shish operatsiyalari yordamida:
Counter c1 =
new
Counter { Value = 23 };
Counter c2 =
new
Counter { Value = 45 };
bool
result = c1 > c2;
Counter c3 = c1 + c2;
Ammo hozirgi vaqtda Counter moslamalari uchun na taqqoslash operatsiyasi, na
qo'shish operatsiyasi mavjud emas. Ushbu operatsiyalar
bir qator ibtidoiy turlari
uchun ishlatilishi mumkin. Masalan, sukut bo'yicha biz raqamli qiymatlarni
qo'shishimiz mumkin, ammo kompilyator murakkab turdagi ob'ektlar
- sinflar va
tuzilmalarni qanday qo'shishni bilmaydi. Va buning uchun biz kerakli operatorlarni
ortiqcha yuklashimiz kerak.
Operatorning ortiqcha yuklanishi biz operatorni aniqlamoqchi bo'lgan ob'ektlar
uchun sinfda maxsus usulni belgilashdan iborat:
public static qaytarish_tip operator
оператор(parametrlar)
{ }
Ushbu usul umumiy statik modifikatorlarga ega bo'lishi kerak, chunki haddan
tashqari yuklangan operator ushbu sinfning barcha ob'ektlari uchun ishlatiladi.
Keyingi qaytish turining nomi. Qaytish turi biz ob'ektlarni
olishni istagan turni
ifodalaydi. Masalan, ikkita Counter moslamasini qo'shish natijasida biz yangi
Counter moslamasini olishni kutmoqdamiz. Va ikkalasini taqqoslash natijasida biz
bool tipidagi ob'ektni olishni istaymiz, bu shartli ifoda to'g'ri yoki yolg'on ekanligini
ko'rsatadi. Ammo vazifaga qarab, qaytarish turlari har qanday bo'lishi mumkin.
Keyin usul nomi o'rniga operator kalit so'zi va operatorning o'zi mavjud. Va
keyin
parametrlar qavs ichida keltirilgan. Ikkilik operatorlar ikkita parametrni, unaryali
operatorlar bitta parametrni oladi. Va har qanday holatda, parametrlardan biri
operatorni aniqlaydigan sinf yoki tuzilmani - turini ko'rsatishi kerak.
Masalan, Counter klassi uchun bir qator operatorlarni ortiqcha yuklaylik:
class
Counter
{
public
int
Value {
get
;
set
; }
public
static
Counter
operator
+(Counter c1, Counter c2)
{
return
new
Counter { Value = c1.Value + c2.Value };
}
public
static
bool
operator
>(Counter c1, Counter c2)
{
return
c1.Value > c2.Value;
}
public
static
bool
operator
<(Counter c1, Counter c2)
{
return
c1.Value < c2.Value;
}
}