Класс — бу тўлақонли маълумот типи бўлгани учун, дастурчи улар устида ўзининг ҳусусий амалларини белгилаши мумкин. Биз илгари амалларни қайта юклаш билан танишган эдик. Масалан, арифметик типлар учун " + " – қўшиш, сатрлар учун эса – бирлаштиришни англатади. Амалларни асосан класслар учун қайта юклаш мумкин.
Унар амаллар
Класс таркибида қуйидагича унар амалларни аниқлаш мумкин:
+ - ! ~ ++ -- true false
Унар амаллар қуйидагича эълон қилинади:
тип operator унар_амал ( параметр )
Унар амал сарлавҳаларига мисоллар:
public static int operator ++( MyObject m )
public static MyObject operator --( MyObject m )
public static bool operator true( MyObject m )
Амалга узатиладиган параметр ўзи аниқланган класс типидаги бўлиб, қуйидагиларни қайтариши лозим:
+, -, ! ва ~ амаллари учун иҳтиёрий типдаги катталикни;
++ ва – амаллари учун улар аниқланган класс типидаги миқдорни;
true ва false амаллари учун bool типидаги катталик.
Амаллар уларга узатилаётган параметрларнинг қийматларини ўзгартириб юбормаслиги лозим. Ўзлари аниқланган класс типидаги қийматларни қайтаручи амаллар шу класснинг янги объектини яратиши ва улар устида белгиланган амалларни бажариши ва натижасини узатиши лозим.
Эслатма
Префикс ва постфиксли инкрементлар фарқланмайди.
Инкремант амалини қайта юклашга намуна (монстр қийматининг бирга ортиши унинг саломатлигини яхшилайди деб қабул қиламиз):
class Monster {
public static Monster operator ++( Monster m )
{
Monster temp = new Monster();
temp.health = m.health + 1;
return temp;
}
…
}
…
Monster vasia = new Monster();
++vasia; vasia++;
Бинар амаллар
Классларда қуйидагича бинар амалларни аниқлаш мумкин:
+ - * / % & | ^ << >> == != > < >= <=
Бинар амаллар қуйидаги схема остида аниқланади:
тип operator бинар_амал (параметр1, параметр2)
Бинар амал сарлавҳасига мисоллар:
public static MyObject operator + ( MyObject m1, MyObject m2 )
public static bool operator == ( MyObject m1, MyObject m2 )
амалга узатиладиган параметрлардан ҳеч бўлмаганда биттаси ўзи аниқланган класс типидаги бўлиши шарт.
== ва !=, > ва <, >= ва <= амаллари фақат операторлар жуфтдилкри учун аниқланади ва одатда мантиқий типдаги қийматларни қайтаради.
Мураккаб қиймат бериш амалларини (масалан, += ) аниқлаш шарт эмас. Бундай холларда аввал қўшиш, сўнгра қиймат бериш амали бажарилади.
Monster класси учун б инар амал атвсифига мисоллар:
class Monster {
public static Monster operator +( Monster m, int k )
{ Monster temp = new Monster();
temp.ammo = m.ammo + k;
return temp;
}
public static Monster operator +( int k, Monster m )
{ Monster temp = new Monster();
temp.ammo = m.ammo + k;
return temp;
}
…
}
…
Monster vasia = new Monster();
Monster masha = vasia + 10;
Monster petya = 5 + masha;
…
Do'stlaringiz bilan baham: |