Programavimas

Kaip dirbti su operatoriaus perkrova C #

Polimorfizmas yra vienas pagrindinių OOP (Object Oriented Programming) principų. Žodis „polimorfizmas“ yra kilęs iš dviejų žodžių - „poly“, reiškiantis daugybę, ir „morph“, reiškiantis formas. Taigi, polimorfizmas reiškia to paties dalyko egzistavimą, tačiau skirtingomis formomis.

Operatoriaus perkrova yra statinio polimorfizmo pavyzdys. Galite pasinaudoti operatoriaus perkrova arba pridėti operatorių funkcionalumą, kad dirbtumėte su vartotojo apibrėžtais tipais taip pat, kaip dirbate su pagrindiniais duomenų tipais.

Kas yra operatoriai ir kokie yra operatoriai, kuriuos galima perkrauti?

Išraiškoje paprastai turite operatorius ir operandus. Operatoriai yra tie, kurie dirba su operandais, ir jie visi yra išraiškos dalis. Toliau pateikiama išraiška, kurioje yra du operandai ir vienas operatorius. Operandai yra X ir Y, o operatorius yra +.

X + Y

Operatoriai skirstomi į vienarūšius, dvejetainius, palyginimo, priskyrimo ir kt., Atsižvelgiant į jų paskirtį ir operandų, kuriuose operatoriai veiktų, skaičių. Nors dauguma operatorių gali būti perkrauti, taikomi tam tikri apribojimai. Iš esmės ne visi operatoriai gali būti perkrauti.

Operatoriai, ty operatoriai, dirbantys su vienu operandu, gali būti perkrauti. Taip pat galite perkrauti dvejetainius operatorius ir palyginimo operatorius, pvz., ==,! =,, =. Tačiau negalima perkrauti operatorių =,?, ->, new, is, sizeof ar typeof. Taip pat negalite perkrauti sąlyginių operatorių, pvz., && ir || lengvai. Be to, masyvo indeksavimo operatorius [] negali būti perkrautas.

Daugiau apie tai, ką visi operatoriai gali perkrauti, galite sužinoti iš šio MSDN straipsnio.

Operatoriaus perkrovimas C #

Šiame skyriuje mes ištirsime, kaip mes galime įgyvendinti operatoriaus perkrovą C #. Apsvarstykite šią klasę, pavadintą „DistanceCalculator“.

viešosios klasės „DistanceCalculator“

   {

Int32 pėdos = 0, colis = 0;

public DistanceCalculator (Int32 pėdos = 0, Int32 colių = 0)

       {

tai.pėdos = pėdos;

this.inch = colis;

       }

   }

Žr. Aukščiau pateiktą kodų sąrašą. „DistanceCalculator“ klasėje yra du „Int32“ tipo duomenų nariai, būtent pėdos ir colis. Dabar prie šios klasės pridėtume daugiau metodų, kurie parodytų, kaip operatoriai gali būti perkrauti.

Dirbdami su operatoriaus perkrova, turite nepamiršti tam tikrų taškų. Operatorius, kuriam bus perkrauta, turėtų turėti atitinkamą metodą, kuris pažymėtas raktiniu žodžiu operatorius. Operatoriaus funkcijos argumentai yra operandai, o jūsų operatoriaus funkcija gali grąžinti vertę. Operatoriaus funkcija turėtų būti statiška ir ji turėtų būti sudėtinio tipo narė.

Šis kodo fragmentas parodo, kaip atrodytų tipinė operatoriaus funkcija. Šis pavyzdys parodo, kaip operatoriai == ir! = Gali būti perkrauti.

viešasis statinis „Bool“ operatorius == („DistanceCalculator obj1“, „DistanceCalculator obj2“)

       {

grąžinti obj1.Value == obj2.Value;

       }

public static bool operatorius! = („DistanceCalculator obj1“, „DistanceCalculator obj2“)

       {

grąžinti obj1.Value! = obj2.Value;

       }

Atminkite, kad reikšmė yra savybė, kuri grąžina vertę coliais.

public Int32 Value

       {

gauti

           {

grįžimas (pėdos * 12) + colis;

           }

       }

Čia yra visas „DistanceCalculator“ klasės kodų sąrašas.

viešosios klasės „DistanceCalculator“

   {

Int32 pėdos = 0, colis = 0;

public DistanceCalculator (Int32 pėdos = 0, Int32 colių = 0)

       {

tai.pėdos = pėdos;

this.inch = colis;

       }

viešasis statinis „Bool“ operatorius == („DistanceCalculator obj1“, „DistanceCalculator obj2“)

       {

grąžinti obj1.Value == obj2.Value;

       }

public static bool operatorius! = („DistanceCalculator obj1“, „DistanceCalculator obj2“)

       {

grąžinti obj1.Value! = obj2.Value;

       }

public override bool Equals (object obj)

       {

DistanceCalculator distanceCalculator = obj kaip DistanceCalculator;

if (distanceCalculator! = null)

           {

grįžti (distanceCalculator == tai);

           }

grąžinti klaidingą;

       }

public override int GetHashCode ()

       {

return Value.GetHashCode ();

       }

viešosios „Int32“ pėdos

       {

gauti {grįžti kojas; }

       }

viešasis „Int32“ colių

       {

gauti {grįžimo colį; }

       }

public Int32 Value

       {

gauti

           {

grįžimas (pėdos * 12) + colis;

           }

       }

   }

Šis kodo fragmentas parodo, kaip galite naudoti „DistanceCalculator“ klasę.

static void Main (string [] args)

       {

DistanceCalculator obj1 = naujas DistanceCalculator (1, 2);

DistanceCalculator obj2 = naujas DistanceCalculator (1, 2);

Console.WriteLine ((obj1 == obj2) .ToString ());

Pultas.Skaitykite ();

       }

Šis kodo fragmentas rodo, kaip galite perkrauti operatorių +, kad pridėtumėte du objektus.

viešasis statinis „DistanceCalculator“ operatorius + („DistanceCalculator obj1“, „DistanceCalculator obj2“)

       {

Int32 totalInches = obj1.Value + obj2.Value;

Int32 pėdos = viso colio / 12;

Int32 colių = viso colio% 12;

DistanceCalculator temp = naujas DistanceCalculator (pėdos, coliai);

grįžimo temperatūra;

       }

Prie „DistanceCalculator“ klasės pridėkime šias dvi savybes. Šis kodo fragmentas parodo, kaip galite pridėti du „DistanceCalculator“ tipo objektus ir grąžinti gautą objektą kaip tą patį tipą, t.

viešosios „Int32“ pėdos

       {

gauti {grįžti kojas; }

       }

viešasis „Int32“ colių

       {

gauti {grįžimo colį; }

       }

Štai kaip galite sukurti du „DistanceCalculator“ klasės egzempliorius ir pasinaudoti perkrauta operatoriaus funkcija, kad priskirtumėte rezultatą kitam to paties tipo objektui.

static void Main (string [] args)

       {

DistanceCalculator obj1 = naujas DistanceCalculator (1, 11);

DistanceCalculator obj2 = naujas DistanceCalculator (1, 2);

DistanceCalculator obj3 = obj1 + obj2;

Console.WriteLine ("Pėdos:" + obj3.Feet.ToString ());

Console.WriteLine ("Inch:" + obj3.Inch.ToString ());

Pultas.Skaitykite ();

       }