Лекция 7. Перегрузка операторов

Наряду с методами мы можем также перегружать операторы. Например, пусть у нас есть следующая класс State, который представляет государство:

class State

{

public string Name { get; set; } // название

public int Population { get; set; } // население

public double Area { get; set; } // площадь

}

И допустим, у нас есть два объекта класса State, то есть по сути два государства, которые мы хотим сравнивать, используя операции сравнения, или хотим по возможности объединять, используя операцию сложения, наподобие:

State state1 = new State{ Name = "State1", Area = 300, Population = 100 };

State state2 = new State{ Name = "State2", Area = 200, Population = 70 };

bool result = state1 > state2;

State state3 = state1 + state2;

Но на данный момент ни операция сравнения, ни операция сложения для объектов State не доступны. Эти операции могут использоваться для ряда примитивных типов. Например, по умолчанию мы можем складывать числовые значения, но как складывать объекты комплексных типов - классов и структур компилятор не знает. И для этого нам надо выполнить перегрузку нужных нам операторов.

Перегрузка операторов заключается в определении в классе, для объектов которого мы хотим определить оператор, специального метода:

public static возвращаемый_тип operator оператор(параметры)

{ }

Этот метод должен иметь модификаторы public static, так как перегружаемый оператор будет использоваться для всех объектов данного класса, далее идет название возвращаемого типа, и после него вместо названия метода идет ключевое слово operator и сам оператор. А затем в скобках параметры. Бинарные операторы принимают два параметра, унарные - один параметр. И в любом случае один из параметров должен представлять тот тип - класс или структуру, в которых определяется оператор.

Например, перегрузим ряд операторов для класса State:

class State

{

public string Name { get; set; } // название

public int Population { get; set; } // население

public double Area { get; set; } // площадь

 

public static State operator +(State s1, State s2)

{

   string name = s1.Name;

   int people = s1.Population+s2.Population;

   double area = s1.Area+s2.Area;

 

   // возвращаем новое объединенное государство

   return new State { Name = name, Area = area, Population = people };

}

 

public static bool operator <(State s1, State s2)

{

   if (s1.Area < s2.Area)

   {

       return true;

   }

   else

   {

       return false;

   }

}

 

public static bool operator >(State s1, State s2)

{

   if (s1.Area > s2.Area)

   {

       return true;

   }

   else

   {

       return false;

   }

}

}

Поскольку все перегруженные операторы - бинарные - то есть проводятся над двумя объектами, то для каждой перегрузки предусмотрено по два параметра. Теперь используем перегруженные операторы в программе:

static void Main(string[] args)

{

State s1 = new State{ Name = "State1", Area = 300, Population = 100 };

State s2 = new State{ Name = "State2", Area = 200, Population = 70 };

 

if (s1 > s2)

{

   Console.WriteLine("Государство s1 больше государства s2");

}

else if (s1 < s2)

{

   Console.WriteLine("Государство s1 меньше государства s2");

}

else

{

   Console.WriteLine("Государства s1 и s2 равны");

}

 

State s3 = s1 + s2;

Console.WriteLine($"Название государства: {s3.Name}");

Console.WriteLine($"Площадь государства: {s3.Area}");

Console.WriteLine($"Население государства: {s3.Population}");

 

Console.ReadLine();

}

При перегрузке операторов надо учитывать, что не все операторы можно перегрузить. Список перегружаемых операторов можно найти в документации msdn

 

Лекция 8. Статические члены и модификатор static


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: