Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 98

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 92 93 94 95 96 97 < 98 > 99 100 101 102 103 104 .. 320 >> Следующая

Перегрузка операторов 231
{
return new PoinUpl.x + p2.x. + o2 v>}
Il ...а метод SubtractPointsO - как перегруженный оператор вычитания
public static Point SSubtractPoints (point pi. Point p2)
{
Il Вычисляем значение новой координаты х int newX = pi.X - р2.х; iftnewX < 0)
throw new ArgumentQutOfRangeException(} ¦.
Il Вычисляем значение новой координаты у int newY = pi.у - р2.у: if(newY < 0)
throw new ArgumentOutOfRangeExceptionO:
return new Point(newX, newY);
)
}
Теперь точки можно складывать еще и так:
Point finalPt = Point.AddPointstptOne. ptTwo):
Console.WriteLineCHy final point: {0}", finalPt.ToStringO):
Пожалуй, использование перегруженного оператора сложения более удобно и интуитивно понятно. Однако перегруженные операторы — это всего лишь боле*: дружественная по отношению к пользователю класса разновидность открытого метода. Кроме того, не следует забывать о несовместимости этого средства с Common Language Specification. Поэтому при создании пользовательских классов, предназначенных для работы в реальных рабочих приложениях, всегда снабжайте пе регружениые операторы обычными методами -аналогами. Это можно делать -ran как было показано выше, однако, чтобы не дублировать код, еще удобнее просто передавать вызовы от перегруженного оператора обычному методу (или наобо рот, если вам больше нравится). Выглядеть это может так:
public class Point ,{
Il Перегруженный оператор сложения вызывает обычный нетод public static Point operator + (Point pi Point p2) {
return AddPointsCpl. p2):
}
public static Point AddPoints (Point Point p2)
{
return new Pointtpl.x+ p2.x. pi.у + p2.y):
}
)
Перегрузка операторов равенства
Как мы помним, в С# часто возникает необходимость замещать метод System. Object. Equal sС), чтобы можно было выполнять сравнения структурных типов (в исходной реализации этот метод поддерживает только сравнение ссылочных типов),
232 Глава 5 • Дополнительные возможности классов
Помимо замещения методов Equal SU и GetHashCodeC) (при замещении E qua 1 s (} замещение GetHashCode() обязательно) вам, скорее всего, потребуется заместить также и операторы равенства (= = и !=). Как это можно сделать, мы вновь продемонстрируем на примере с точкой.
// Новое воплощение класса Point снабжено еще и перегруженными операторами // равенства - - и I-
public class Point
(
public int х, у; public PointC){}
public і -.: , - xPos, int .y-M)o - xPos: у = yPos:}
public override bool E^alsCobjeet o) {
ifC (<Point)o).x = - this.X && ((Point)o).y - = this.y) return true:
else
return false;
}
public override int GetHashCodeC)
{ return this.ToStNngO ,GetHashCodeO; }
Il А вот и сана перегрузка операторов равенства
static bool operator - = (Point pi. Point p2)
return
}
static bool operator Point
return
Обратите внимание, что для перегрузки операторов равенства нам ничего не надо выдумывать — мы просто передаем выполнение всей необходимой работы замещенному методу Equals О. Теперь, если нам потребуется использовать обновленный класс Point в нашей программе, мы можем сделать это следующим обра-
зом:
// Применяем перегруженные операторы равеьст public static int Main(stnng[] args)
iftptOne - = ptTwo) I/ Две точки совпадают?
Console.WriteLirie{"Same values!"):
else
Console.WriteLineC'Nope. different values.");
ifCptOne I- ptTwo) И Это разные точки?
Console.WM teL1ne( "These are not equal."):
el se
Console.WriteLineC'Same va' ues і1 );
Перегрузка операторов 233
В подавляющем большинстве случаев программисты стремятся использовать именно понятные и знакомые операторы = = и !=. Применение ихинтуитивно, чего не скажешь о методе Equals О. Поэтому настоятельно рекомендуется в тех ситуациях, когда вы заместили метод EqualsС}, позаботиться еще и о перегрузке операторов = = и !=.
Еще один момент, который необходимо обязательно отметить, - С# не позволит вам перегрузить оператор - = без перегрузки оператора ! - или наоборот (точно также, как методы Equalsu и GetHashCodeO можно перегружать только в паре). Такой подход гарантирует, что все операторы равенства будут применяться одинаково корректно.
Код приложения OverLoadOps можно найти в подкаталоге Chapter 5.
Перегрузка операторов сравнения
В предыдущей главе мы познакомились с тем, как реализовывать интерфейс !Сот рагаЫедля того, чтобы было можно проводить сравнения объектов. Скорее всего, если мы реализовали этот интерфейс в определении класса, нам также понадобится перегрузить для этого класса операторы сравнения (<, >, <= и >=). Аргументы в пользу этого решения — такие же, как в случае перегрузки операторов равенства: использование привычных операторов проще и интуитивно понятнее, чем вызов для сравнения специальных методов. Необходимо отметить, что, как и в случае с операторами равенства, С# позволяет производить перегрузку операторов сравнения только парами. Первая пара — это операторы < и >, а вторая — <= и >=.
Если мы перегрузим операторы сравнения для класса Саг, мы сможем работать с объектами этого класса следующим образом:
Предыдущая << 1 .. 92 93 94 95 96 97 < 98 > 99 100 101 102 103 104 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100