Kako raditi s preopterećenjem operatora u C #

Polimorfizam je jedno od osnovnih načela OOP-a (objektno orijentirano programiranje). Riječ Polimorfizam izvedena je iz dviju riječi - "poli" što znači mnogo, i "morf" što znači oblici. Dakle, polimorfizam podrazumijeva postojanje iste stvari, ali u različitim oblicima.

Preopterećenje operatora primjer je statičkog polimorfizma. Možete iskoristiti preopterećenje operatora ili dodati funkcionalnost operatorima tako da rade s korisnički definiranim tipovima na sličan način kao što radite s osnovnim vrstama podataka.

Koji su operatori, a koji operateri koji se mogu preopteretiti?

U izrazu obično imate operatore i operande. Operateri su oni koji rade na operandima i svi su oni dio izraza. Kao primjer, slijedi izraz koji sadrži dva operanda i jedan operator. Operandi su X i Y, a operator +.

X + Y

Operatori su klasificirani kao unarni, binarni, usporedni, dodijeljeni itd., Ovisno o njihovoj namjeni i broju operanda na kojima bi operatori radili. Iako se većina operatora može preopteretiti, vrijede određena ograničenja. U osnovi, ne mogu se svi operateri preopteretiti.

Unarni operatori, tj. Operatori koji rade s jednim operandom, mogu se preopteretiti. Također možete preopteretiti binarne operatore i operatore usporedbe poput, ==,! =,, =. Međutim, ne možete preopteretiti operatore =,?, ->, new, is, sizeof ili typeof. Također ne možete preopteretiti uvjetne operatore poput && i || lako. Također, operator indeksiranja niza [] ne može se preopteretiti.

Iz ovog MSDN članka možete saznati više o tome što sve operatore može preopteretiti.

Implementacija preopterećenja operatora u C #

U ovom ćemo odjeljku istražiti kako možemo implementirati preopterećenje operatora u C #. Razmotrite sljedeću klasu pod nazivom DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

   }

Pogledajte gornji popis kodova. Klasa DistanceCalculator sadrži dva člana podataka tipa Int32, naime stopa i inč. Sada bismo ovoj klasi dodali još metoda da bismo ilustrirali kako se operatori mogu preopteretiti.

Kada radite s preopterećenjem operatera, morate imati na umu određene točke. Operator koji se preopterećuje trebao bi imati odgovarajuću metodu koja je označena operatorom ključne riječi. Argumenti funkcije operatora su operandi i vaša funkcija operatora može vratiti vrijednost. Funkcija operatora trebala bi biti statična i trebala bi biti član tipa koji sadrži.

Sljedeći isječak koda ilustrira kako bi izgledala tipična funkcija operatora. Ovaj primjer pokazuje kako se operateri == i! = Mogu preopteretiti.

public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

Imajte na umu da je vrijednost svojstvo koje vraća vrijednost u inčima.

public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

Evo kompletnog popisa kodova klase DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

       public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

       public override bool Equals(object obj)

       {

           DistanceCalculator distanceCalculator = obj as DistanceCalculator;

           if (distanceCalculator != null)

           {

               return (distanceCalculator == this);

           }

           return false;

       }

       public override int GetHashCode()

       {

           return Value.GetHashCode();

       }

     public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

       public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

   }

Sljedeći isječak koda ilustrira kako možete koristiti klasu DistanceCalculator.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 2);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

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

           Console.Read();

       }

Sljedeći isječak koda pokazuje kako možete preopteretiti + operator da biste dodali dva objekta.

public static DistanceCalculator operator +(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           Int32 totalInches = obj1.Value + obj2.Value;

           Int32 feet = totalInches / 12;

           Int32 inch = totalInches % 12;

           DistanceCalculator temp = new DistanceCalculator(feet, inch);

           return temp;

       }

Dodajmo sljedeća dva svojstva u klasu DistanceCalculator. Sljedeći isječak koda pokazuje kako možete dodati dva objekta tipa DistanceCalculator i vratiti rezultirajući objekt kao isti tip, tj. Vraćeni objekt je tipa DistanceCalculator.

public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

Evo kako možete stvoriti dvije instance klase DistanceCalculator i iskoristiti funkciju preopterećenog operatora da biste dodijelili rezultat drugom objektu iste vrste.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 11);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

           DistanceCalculator obj3 = obj1 + obj2;

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

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

           Console.Read();

       }