Operatorlarni bekor qilish
Dart bizga bir qator o'rnatilgan operatorlarning xatti-harakatlarini o'zgartirishga imkon beradi, bu bizga ob'ektlar bilan ishlashning qo'shimcha imkoniyatlaridan foydalanish imkonini beradi. Masalan, bizda quyidagi Counter klassi bor deylik:
1
2
3
4
5
|
class Counter{
int value;
Counter(this.value);
}
|
Bu sinf ba'zi hisoblagichni ifodalaydi, uning qiymati qiymat maydonida saqlanadi.
Aytaylik, bizda Counter sinfining ikkita ob'ekti bor - standart taqqoslash va qo'shish operatsiyalari yordamida qiymat maydoniga qarab solishtirmoqchi yoki qo'shmoqchi bo'lgan ikkita hisoblagich:
1
2
3
4
5
|
Counter counter1 = Counter(5);
Counter counter2 = Counter(15);
Counter counter3 = counter1 + counter2;
bool isFirstGreater = counter1 > counter2;
|
Lekin sukut bo'yicha Counter ob'ektlari uchun solishtirish ham, qo'shish ham mavjud emas. Ushbu operatsiyalar int kabi ibtidoiy turdagi ob'ektlar bilan ishlatilishi mumkin. Ammo Dart ishlab chiquvchi tomonidan belgilangan sinflar ob'ektlarini qanday qo'shishni bilmaydi. Buning uchun esa tegishli operatorlarni qayta belgilashimiz kerak.
Operatorlarni bekor qilish sinfdagi maxsus usulni aniqlashdan iborat bo'lib, biz operatorni aniqlamoqchi bo'lgan ob'ektlar uchun:
1
|
возвращаемый_тип operator оператор(параметр) { }
|
Qaytish turi biz ob'ektlarni olishni istagan turni ifodalaydi. Masalan, ikkita Counter ob'ektini qo'shish natijasida 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. Keyin usul nomi o'rniga operator kalit so'zi va operatorning o'zi mavjud. Va keyin parametr qavs ichida ko'rsatilgan.
Masalan, Counter klassi uchun qo'shish operatorini ortiqcha yuklaymiz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
void main (){
Counter counter1 = Counter(5);
Counter counter2 = Counter(15);
Counter counter3 = counter1 + counter2;
print(counter3.value); // 20
}
class Counter{
int value;
Counter(this.value);
Counter operator +(Counter otherCounter){
return Counter(this.value + otherCounter.value);
}
}
|
qo'shish amalida biz Counter sinfining ikkita ob'ektini qo'shmoqchimiz, keyin operator ushbu sinf ob'ektini parametr sifatida oladi. Va biz qo'shish natijasida yangi Counter ob'ektini olishni xohlayotganimiz sababli, bu sinf qaytish turi sifatida ham ishlatiladi. Ushbu operatorning barcha harakatlari yangi ob'ektni yaratishga qisqartiriladi, uning qiymat maydoni ikkala ob'ektning qiymat maydonining qiymatlarini birlashtiradi.
Shuni ta'kidlash kerakki, biz barcha Dart operatorlarini bekor qila olmaymiz, lekin ulardan faqat ba'zilari, xususan: <+ | []> / ^ [] = <= ~ / & ~> = * << == -% >>
Masalan, biz Counter sinfi uchun> va
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
void main (){
Counter counter1 = Counter(5);
Counter counter2 = Counter(15);
bool isFirstGreater = counter1 > counter2;
print(isFirstGreater); // false
bool isFirstLess = counter1 < counter2;
print(isFirstLess); // true
}
class Counter{
int value;
Counter(this.value);
Counter operator +(Counter otherCounter){
return Counter(this.value + otherCounter.value);
}
bool operator >(Counter otherCounter) => this.value > otherCounter.value;
bool operator <(Counter otherCounter) => this.value < otherCounter.value;
}
|
operatsiyalari bool tipidagi qiymatni qaytarganligi sababli, bu erda ham operator aniqlanganda, qaytarish turi bool bo'ladi va operatorning haqiqiy ishi ikkalasining qiymat maydonlari qiymatlarini solishtirishga qisqartiriladi. ob'ektlar.
Yuqoridagi misollarda bir xil turdagi ob'ekt hisoblagich parametr sifatida berilgan bo'lsa-da, bu ixtiyoriy, bizning vazifamizga qarab, parametr har qanday turni ifodalashi mumkin. Masalan, kodni quyidagicha o'zgartiramiz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
void main (){
Counter counter1 = Counter(15);
Counter counter2 = counter1 + 25;
print(counter2.value); // 40
int diff = counter1 - 7;
print(diff); // 8
}
class Counter{
int value;
Counter(this.value);
Counter operator +(int number){
return Counter(this.value + number);
}
int operator -(int number){
return this.value - number;
}
}
|
Qo'shish operatori endi Counter ob'ekti va oddiy raqamni qo'shish imkonini beradi va yangi Counter ob'ektini qaytaradi. Va ayirish operatori Hisoblagichdan raqamni ayirish imkonini beradi va boshqasini qaytaradi - qiymat maydoni va ayirilgan raqam o'rtasidagi farq.
|