Как да работя с претоварване на оператор в C #

Полиморфизмът е един от основните принципи на ООП (обектно-ориентирано програмиране). Думата Полиморфизъм произлиза от две думи - "поли", което означава много, и "морфа", което означава форми. Следователно, полиморфизмът предполага съществуването на едно и също нещо, но в различни форми.

Претоварването на оператора е пример за статичен полиморфизъм. Можете да използвате претоварването на оператора или да добавите функционалност към операторите, така че да работите с дефинирани от потребителя типове по същия начин, по който работите с основните типове данни.

Какви са операторите и кои са операторите, които могат да бъдат претоварени?

В израз обикновено имате оператори и операнди. Операторите са тези, които работят върху операндите и всички те са част от израз. Като пример по-долу е израз, който съдържа два операнда и един оператор. Операндите са X и Y, а операторът е +.

X + Y

Операторите се класифицират като унарни, двоични, сравнителни, присвояващи и т.н. в зависимост от тяхното предназначение и броя на операндите, върху които операторите ще работят. Въпреки че повечето оператори могат да бъдат претоварени, важат определени ограничения. По същество не всички оператори могат да бъдат претоварени.

Унарните оператори, т.е. операторите, които работят с един операнд, могат да бъдат претоварени. Можете също да претоварите двоични оператори и оператори за сравнение като, ==,! =,, =. Не можете обаче да претоварвате операторите =,?, ->, new, is, sizeof или typeof. Не можете също да претоварвате условните оператори като && и || лесно. Също така, операторът за индексиране на масив [] не може да бъде претоварен.

Можете да научите повече за това какво всички оператори могат да бъдат претоварени от тази статия на MSDN.

Внедряване на претоварване на оператор в C #

В този раздел ще разгледаме как можем да приложим претоварване на оператора в C #. Помислете за следния клас, наречен DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

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

       {

           this.feet = feet;

           this.inch = inch;

       }

   }

Вижте списъка с кодове по-горе. Класът DistanceCalculator съдържа два члена с данни от тип Int32, а именно фута и инч. Сега бихме добавили повече методи към този клас, за да илюстрираме как операторите могат да бъдат претоварени.

Когато работите с претоварване на оператора, трябва да имате предвид някои моменти. Операторът, който трябва да бъде претоварен, трябва да има съответния метод, който е маркиран с оператора на ключовата дума. Аргументите към операторската функция са операнди и вашата операторска функция може да върне стойност. Функцията на оператора трябва да е статична и да е член на съдържащия тип.

Следният кодов фрагмент илюстрира как би изглеждала типична операторска функция. Този пример показва как операторите == и! = Могат да бъдат претоварени.

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;

       }

Имайте предвид, че Value е свойство, което връща стойността в инчове.

public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

Ето пълния списък с кодове на класа 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;

           }

       }

   }

Следният кодов фрагмент илюстрира как можете да използвате класа 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();

       }

Следният кодов фрагмент показва как можете да претоварите оператора +, за да добавите два обекта.

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;

       }

Нека добавим следните две свойства към класа DistanceCalculator. Следният кодов фрагмент показва как можете да добавите два обекта от тип DistanceCalculator и да върнете резултантния обект като същия тип, т.е. върнатият обект е от тип DistanceCalculator.

public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

Ето как можете да създадете два екземпляра от класа DistanceCalculator и да се възползвате от претоварената функция на оператора, за да присвоите резултата в друг обект от същия тип.

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();

       }