// р3 = Point.операция-(p1, р2)

р3 = p1 – p2;

<p>Операции += и -=</p>

Если вы изучаете C#, уже имея опыт использования C++, то можете обратить внимание на отсутствие возможности перегрузки операторных сокращений, включающих операцию присваивания (+=, -= и т.д.). Не волнуйтесь, в C# операторные сокращения с присваиванием моделируются автоматически, если тип предполагает перегрузку соответствующей бинарной операции. Поэтому, поскольку структура Point уже использует перегрузку операций + и -, вы можете записать следующее.

// Перегрузка бинарных операций автоматически влечет перегрузку

// операторных сокращений с присваиванием.

static void Main(string[] args) {

 // Автоматическая перегрузка +=

 Point ptThree = new Point(90, 5);

 Console.WriteLine("ptThree = {0}", ptThree);

 Console.WriteLine("ptThree +=ptTwo: {0}", ptThree += ptTwo);

 // Автоматическая перегрузка -=

 Point ptFour = new Point(0, 500);

 Console.WriteLine("ptFour = {0}", ptFour);

 Console.WriteLine("ptFour -= ptThree: {0}", ptFour -= ptThree);

}

<p>Перегрузка унарных операций</p>

В C# также позволяется перегрузка унарных операций, таких как, например, ++ и --. При перегрузке унарной операции вы тоже должны с помощью ключевого слова operator определить статический метод, но в данном случае передается только один параметр, который должен иметь тип, соответствующий определяющему классу или структуре. Например, если добавить в Point следующие перегруженные операции

public struct Point {

 …

 // Добавление 1 к поступившему Point.

 public static Point operator++(Point p1) { return new Point(p1.x+1, p1.y+1); }

 // Вычитание 1 от поступившего Point.

 public static Point operator--(Point p1) { return new Point(p1.x-1, p1.y-1); }

}

то вы получите возможность увеличивать или уменьшать на единицу значения X и Y объекта Point, как показано ниже.

static void Main(string[] args) {

 …

 // Применение унарных операций ++ и -- к Point.

 Console.WriteLine("++ptFive = {0}", ++ptFive);

 Console.WriteLine("--ptFive = {0}", --ptFive);

}

<p>Перегрузка операций проверки на тождественность</p>

Вы можете помнить из материала главы 3, что System.Object.Equals можно переопределить, чтобы сравнение типов выполнялось на основе значений (а не ссылок). Если вы переопределите Equals (и связанный с Equals метод System.Object.GetHashCode), то будет очень просто задать перегрузку операций проверки на тождественность (== и !=). Для иллюстрации мы рассмотрим обновленный тип Point.

// Такая 'инкарнация' Point задает также перегрузку операций == и !=.

public struct Point {

 …

 public override bool Equals(object o) {

  if (o is Point) {

   if (((Point)o).x == this.x && ((Point)о). у == this.y) return true;

  }

  return false;

 }

 public override int GetHashCode { return this.ToString.GetHashCode; }

 // Здесь позволяется перегрузка операций == и !=.

 public static bool operator==(Point p1, Point p2) { return p1.Equals(p2); }

 public static bool operator!=(Point p1, Point p2) { return!p1.Equals(p2); }

}

Обратите внимание на то, что данная реализация операций == и != просто вызывает переопределенный метод Equals, который и выполняет основную работу. С учетом этого вы можете теперь использовать свой класс Point так.

// Использование перегруженных операций проверки на тождественность.

static void Main(string[] args) {

 …

 Console.WriteLine("ptOne == ptTwo: {0}", ptOne == ptTwo);

Перейти на страницу:

Похожие книги