Programmering

Hvordan jobbe med overbelastning av operatører i C #

Polymorfisme er et av de grunnleggende prinsippene i OOP (Object Oriented Programming). Ordet polymorfisme er avledet av to ord - "poly" som betyr mange, og "morph" som betyr former. Derfor innebærer polymorfisme eksistensen av det samme, men i forskjellige former.

Overbelastning av operatører er et eksempel på statisk polymorfisme. Du kan utnytte operatøroverbelastning eller legge funksjonalitet til operatører for å jobbe med brukerdefinerte typer på samme måte som du jobber med grunnleggende datatyper.

Hva er operatørene og hva er operatørene som kan overbelastes?

I et uttrykk har du vanligvis operatorer og operander. Operatører er de som jobber på operander, og de er alle en del av et uttrykk. Som et eksempel er det følgende et uttrykk som inneholder to operander og en operator. Operandene er X og Y og operatøren er +.

X + Y

Operatører klassifiseres som unary, binær, sammenligning, tildeling osv. Avhengig av deres formål og antall operander som operatørene vil jobbe med. Selv om de fleste operatører kan bli overbelastet, gjelder visse begrensninger. I hovedsak kan ikke alle operatører bli overbelastet.

De unære operatørene, dvs. operatører som jobber med en operand, kan bli overbelastet. Du kan også overbelaste binære operatører og sammenligningsoperatører som ==,! =,, =. Du kan imidlertid ikke overbelaste operatørene =,?, ->, new, is, sizeof eller typeof. Du kan ikke overbelaste de betingede operatørene som && og || Enkelt. Dessuten kan arrayindekseringsoperatøren [] ikke overbelastes.

Du kan lære mer om hva alle operatører kan bli overbelastet fra denne MSDN-artikkelen.

Implementering av overbelastning av operatør i C #

I denne delen vil vi undersøke hvordan vi kan implementere overbelastning av operatører i C #. Tenk på følgende klasse som heter DistanceCalculator.

offentlig klasse DistanceCalculator

   {

Int32 fot = 0, tomme = 0;

offentlig DistanceCalculator (Int32 fot = 0, Int32 tomme = 0)

       {

denne. føtter = føtter;

this.inch = tomme;

       }

   }

Se kodelisten ovenfor. DistanceCalculator-klassen inneholder to dataelementer av typen Int32, nemlig føtter og tommer. Vi vil nå legge til flere metoder i denne klassen for å illustrere hvordan operatører kan overbelastes.

Når du arbeider med operatøroverbelastning, må du huske visse punkter. Operatøren som skal overbelastes, bør ha en tilsvarende metode som er merket med søkeordoperatøren. Argumentene til operatørfunksjonen er operander og operatørfunksjonen din kan returnere en verdi. Operatørfunksjonen skal være statisk og den skal være et medlem av den inneholder typen.

Følgende kodebit illustrerer hvordan en typisk operatørfunksjon vil se ut. Dette eksemplet viser hvordan operatørene == og! = Kan overbelastes.

offentlig statisk booloperatør == (DistanceCalculator obj1, DistanceCalculator obj2)

       {

return obj1.Value == obj2.Value;

       }

offentlig statisk booloperatør! = (DistanceCalculator obj1, DistanceCalculator obj2)

       {

return obj1.Value! = obj2.Value;

       }

Merk at verdi er en egenskap som returnerer verdien i tommer.

offentlig Int32-verdi

       {

           {

retur (fot * 12) + tomme;

           }

       }

Her er den komplette kodelisten for DistanceCalculator-klassen.

offentlig klasse DistanceCalculator

   {

Int32 fot = 0, tomme = 0;

offentlig DistanceCalculator (Int32 fot = 0, Int32 tomme = 0)

       {

denne. føtter = føtter;

this.inch = tomme;

       }

offentlig statisk booloperatør == (DistanceCalculator obj1, DistanceCalculator obj2)

       {

return obj1.Value == obj2.Value;

       }

offentlig statisk booloperatør! = (DistanceCalculator obj1, DistanceCalculator obj2)

       {

return obj1.Value! = obj2.Value;

       }

offentlig overstyring bool lik (objekt obj)

       {

DistanceCalculator distanceCalculator = obj som DistanceCalculator;

hvis (distanceCalculator! = null)

           {

retur (distanceCalculator == dette);

           }

returner falsk;

       }

offentlig overstyring int GetHashCode ()

       {

returner Value.GetHashCode ();

       }

offentlige Int32 føtter

       {

få {retur føtter; }

       }

offentlig Int32 tommer

       {

få {retur tomme; }

       }

offentlig Int32-verdi

       {

           {

retur (fot * 12) + tomme;

           }

       }

   }

Følgende kodebit illustrerer hvordan du kan bruke klassen DistanceCalculator.

statisk tomrom Main (streng [] args)

       {

DistanceCalculator obj1 = ny DistanceCalculator (1, 2);

DistanceCalculator obj2 = ny DistanceCalculator (1, 2);

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

Console.Read ();

       }

Følgende kodebit viser hvordan du kan overbelaste + -operatøren for å legge til to objekter.

offentlig statisk DistanceCalculator-operatør + (DistanceCalculator obj1, DistanceCalculator obj2)

       {

Int32 totalInches = obj1.Value + obj2.Value;

Int32 fot = total tommer / 12;

Int32 tommer = total tommer% 12;

DistanceCalculator temp = ny DistanceCalculator (fot, tomme);

retur temp;

       }

La oss legge til følgende to egenskaper i DistanceCalculator-klassen. Følgende kodebit viser hvordan du kan legge til to objekter av typen DistanceCalculator og returnere det resulterende objektet som samme type, dvs. det returnerte objektet er av typen DistanceCalculator.

offentlige Int32 føtter

       {

få {retur føtter; }

       }

offentlig Int32 tommer

       {

få {retur tomme; }

       }

Slik kan du opprette to forekomster av klassen DistanceCalculator og dra nytte av den overbelastede operatørfunksjonen for å tildele resultatet til et annet objekt av samme type.

statisk tomrom Main (streng [] args)

       {

DistanceCalculator obj1 = ny DistanceCalculator (1, 11);

DistanceCalculator obj2 = ny DistanceCalculator (1, 2);

DistanceCalculator obj3 = obj1 + obj2;

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

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

Console.Read ();

       }