Основы объектно-ориентированного программирования на языке C# book | Page 146

7 Класи виконання a = b++; a буде указувати на туж саму дiлянку, що зберiгає (0,0). Тобто при перевантаженнi повнiстю збережено семантику стандартних унарних операцiй. 7.7.3 Перевантаження операторiв порiвняння Тепер розглянемо як перевантажувати оператори порiвняння. В мовi C# усi класи спакуються вiд класу Object , тому поряд iз стандар- тними операторами, нам необхiдно також перевантажити два методи цього класу Equals i GetHashCode . Метод Equals дозволяє порiвнюва- ти два об’єкти, а метод GetHashCode обчислює хеш-код об’єкту. Якщо метод Equals вважає, що два об’єкти рiвнi, то метод GetHashCode по- винен згенерувати для них однаковi значення. Нагадаємо, що деякi оператори необхiдно перевантажувати парами: == i != , < i <= , > i >= . Покажемо, як перевантажити оператори порiвняння для нашого при- клад точок на плоскостi. Будемо вважати. що точки спiвпадають, якщо ı̈хнi координати рiвнi, одна точка менше/бiльше за iншу, якщо вiдповiднi координати менше/бiльше. public static bool operator ==( Point2D a, Point2D b) { if (a.x == b.x && a.y == b.y) return true; else return false; } public static bool operator !=( Point2D a, Point2D b) { if (a.x != b.x || a.y != b.y) return true; else return false; } public override bool Equals(object o) { if(o.GetType() != GetType()) return false; Point2D t = (Point2D) o; return (x == t.x && y == t.y); } public override int GetHashCode () { return 0; } Розглянемо ще один приклад для закрiплення. Давайте напишемо реалiзацiю засобами C# операцiı̈ iз звичайними дробами: 146