Programiranje

Kako delati s preobremenitvijo operaterja v C #

Polimorfizem je eno od osnovnih načel OOP (objektno usmerjeno programiranje). Beseda polimorfizem izhaja iz dveh besed - "poly", ki pomeni veliko, in "morph", ki pomeni oblike. Polimorfizem torej pomeni obstoj iste stvari, vendar v različnih oblikah.

Preobremenitev operaterja je primer statičnega polimorfizma. Izkoristite lahko preobremenitev operaterja ali operaterjem dodate funkcionalnost, tako da delate z uporabniško določenimi tipi podobno kot delate s temeljnimi podatkovnimi tipi.

Kaj so operaterji in kateri operaterji se lahko preobremenijo?

V izrazu imate običajno operatorje in operande. Operaterji so tisti, ki delujejo na operande in so vsi del izraza. Kot primer je naslednji izraz, ki vsebuje dva operanda in en operator. Operandi so X in Y, operator pa +.

X + Y

Operaterji so razvrščeni kot enobarvni, binarni, primerjalni, dodeljevalni itd., Odvisno od njihovega namena in števila operandov, na katerih bi operaterji delali. Čeprav je večina operaterjev lahko preobremenjena, veljajo nekatere omejitve. V bistvu vseh operaterjev ni mogoče preobremeniti.

Unarni operatorji, tj. Operaterji, ki delajo z enim operandom, so lahko preobremenjeni. Lahko tudi preobremenite binarne operatorje in operatorje primerjave, kot so ==,! =,, =. Vendar ne morete preobremeniti operatorjev =,?, ->, new, is, sizeof ali typeof. Pogojnih operatorjev, kot sta && in ||, tudi ne morete preobremeniti enostavno. Tudi operaterja indeksiranja polja [] ni mogoče preobremeniti.

Iz tega članka MSDN lahko izveste več o tem, katere operaterje je mogoče preobremeniti.

Izvajanje preobremenitve operaterja v C #

V tem poglavju bomo raziskali, kako lahko v C # izvedemo preobremenitev operaterja. Razmislite o naslednjem razredu z imenom DistanceCalculator.

javni razred DistanceCalculator

   {

Int32 čevljev = 0, palcev = 0;

javni DistanceCalculator (Int32 čevljev = 0, Int32 palcev = 0)

       {

this.feet = noge;

this.inch = palec;

       }

   }

Glejte zgornji seznam kod. Razred DistanceCalculator vsebuje dva podatkovna člana tipa Int32, in sicer noge in palec. Zdaj bi temu razredu dodali več metod za ponazoritev, kako lahko operaterje preobremenimo.

Pri delu s preobremenitvijo operaterja morate upoštevati določene točke. Operater, ki ga je treba preobremeniti, mora imeti ustrezno metodo, ki je označena z operatorjem ključne besede. Argumenti operatorjeve funkcije so operandi in vaša operaterska funkcija lahko vrne vrednost. Operatorska funkcija mora biti statična in mora biti član vrste, ki vsebuje.

Naslednji delček kode prikazuje, kako bi izgledala tipična operacijska funkcija. Ta primer prikazuje, kako je mogoče operatorje == in! = Preobremeniti.

javni statični operater bool == (DistanceCalculator obj1, DistanceCalculator obj2)

       {

vrni obj1.Value == obj2.Value;

       }

javni statični operater bool! = (DistanceCalculator obj1, DistanceCalculator obj2)

       {

vrni obj1.Value! = obj2.Value;

       }

Upoštevajte, da je vrednost lastnost, ki vrne vrednost v palcih.

javna vrednost Int32

       {

dobili

           {

povratek (noge * 12) + palec;

           }

       }

Tu je popoln seznam kod razreda DistanceCalculator.

javni razred DistanceCalculator

   {

Int32 čevljev = 0, palcev = 0;

javni DistanceCalculator (Int32 čevljev = 0, Int32 palcev = 0)

       {

this.feet = noge;

this.inch = palec;

       }

javni statični operater bool == (DistanceCalculator obj1, DistanceCalculator obj2)

       {

vrni obj1.Value == obj2.Value;

       }

javni statični operater bool! = (DistanceCalculator obj1, DistanceCalculator obj2)

       {

vrni obj1.Value! = obj2.Value;

       }

public override bool Enako (objekt obj)

       {

DistanceCalculator distanceCalculator = obj kot DistanceCalculator;

if (distanceCalculator! = null)

           {

vrnitev (distanceCalculator == to);

           }

vrni false;

       }

javno preglasitev int GetHashCode ()

       {

vrnitev Value.GetHashCode ();

       }

javni Int32 Stopala

       {

get {vrnitev stopal; }

       }

javni Int32 Inch

       {

get {return inch; }

       }

javna vrednost Int32

       {

dobili

           {

povratek (noge * 12) + palec;

           }

       }

   }

Naslednji delček kode prikazuje, kako lahko uporabite razred DistanceCalculator.

statična praznina Main (string [] args)

       {

DistanceCalculator obj1 = nov DistanceCalculator (1, 2);

DistanceCalculator obj2 = nov DistanceCalculator (1, 2);

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

Console.Read ();

       }

Naslednji delček kode prikazuje, kako lahko operater + preobremenite, da dodate dva predmeta.

javni statični operator DistanceCalculator + (DistanceCalculator obj1, DistanceCalculator obj2)

       {

Int32 totalInches = obj1.Value + obj2.Value;

Int32 čevljev = skupajInches / 12;

Int32 inch = skupajInches% 12;

DistanceCalculator temp = nov DistanceCalculator (čevlji, palci);

vrnitev temp;

       }

V razred DistanceCalculator dodamo naslednji dve lastnosti. Naslednji delček kode prikazuje, kako lahko dodate dva predmeta tipa DistanceCalculator in dobljeni objekt vrnete kot isti tip, tj. Vrnjeni objekt je vrste DistanceCalculator.

javni Int32 Stopala

       {

get {vrnitev stopal; }

       }

javni Int32 Inch

       {

get {return inch; }

       }

Tukaj je opisano, kako lahko ustvarite dva primerka razreda DistanceCalculator in izkoristite funkcijo preobremenjenega operaterja, da rezultat dodelite drugemu objektu iste vrste.

statična praznina Main (string [] args)

       {

DistanceCalculator obj1 = nov DistanceCalculator (1, 11);

DistanceCalculator obj2 = nov DistanceCalculator (1, 2);

DistanceCalculator obj3 = obj1 + obj2;

Console.WriteLine ("Noge:" + obj3.Feet.ToString ());

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

Console.Read ();

       }

$config[zx-auto] not found$config[zx-overlay] not found