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

 

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

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

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

// Складываем два строковых значения string sl = "Hello"; string s2 - " world!":
string s3 - sl + s2; It Hello world!
Ответ прост - оператор перегружен таким образом, чтобы он мог нормально работать с самыми разными типами данных. Если мы применяем его к числовым типам, производится сложение. Если он применяется к строковым типам, производится слияние текстовых строк — конкатенация. Язык С# (подобно C++ и в противоположность Java) позволяет создавать пользовательские классы и структуры, которые будут реагировать по-своему (как мы определим) на те же самые встроенные операторы, например на оператор сложения ¦*+». Этот прием называется перегрузкой операторов.
Рассматривать перегрузку операторов мы будем на примере класса Point (точка);
public class Point {
private int x, у; public PointOf} public Pointfuit xPos. int {
X = xPos; у - yPos:
public override string ToStringO {
return "X pas: " +this.x + "Y pos: " + this.y:
)
)
Перегрузка операторов 229
У нашей точки есть координаты, и мы вполне можем «складывать» между собой две точки (при этом будет происходить сложение их координат) и «вычитать » одну точку из другой (координаты второй точки будут вычитаться из первой). Удобнее всего, конечно, делать это так:
// «Складываем» и «вычитаем» точки public static int Ma1n(string[] args) {
II Задаем две точки
Point ptOne - new PointUOQ. 100);
Point ptTwo - new Po1nt(40. 40);
Il «Складываем» две точки, чтобы получить третью Point bigPolnt - ptOne + ptTwo;
Console.WriteLi net"Here is the big point: [Q}". bigPoint.ToStringO);
// «Вычитаем» одну точку из другой, чтобы получить третью Point mlnorPoint = bigPoint - ptOne;
Console.WriteLineC"Just a minor point: (0}". minorPoint.ToStringO);
.
return 0:
}
Чтобы приведенный выше код заработал, осталось сделать самую малость внести некоторые изменения в класс Po" nt, чтобы объекты этого класса знали, как им реагировать на операторы «+» и ¦*-». В С# для этого можно использовать ключевое слово operator. Обратите внимание, что его можно использовать только вместе с ключевым словом static:
// Класс Point с перегруженными операторами
public class Point
{
private int x. у; public PointOO:
public PolntCint xPos. int yPos){ x - xPos; у - yPos; )
// Перегрушаєм оператор сложения
public static Point operator + (Point pi. Point p2)
{
Point newPoint - new Point(pl.x + p2.x, pi.у + p2.y); return newPoint:
)
// . . и вычитания
public static Point operator - (Point pi. Point p2)
//Вычисляем значение новой координаты х int newX = pi.x - p2.x: if(newX < 0)
throw new ArguraentOutOfRangeExceptionO;
Il Вычисляем значение новой координаты у int newY - pi.у - p2.y; if(newY < 0)
throw new ArgumentOutOfRangeExcepti on<);
return new Point(newX. newY);
I
230 Глава 5
Дополнительные возможности классов С#
public override string ToStringO
)
J
return "X pos: " + tnis.x • " Y pos: + Uns у:
Обратите внимание, что теперь наш класс содержит два немного странных с виду метода, которые называются operator + и operator -. Роль обоих методов понятна — вернуть новую точку (объект класса Point) с координатами, рассчитанными на основе координат двух исходных точек. В результате при сложении двух объектов Poi nt в коде программы будет неявно вызван метод operator +:
// рЗ « Poi nt. operator + (pi. р2)
рЗ - pi + р2;
То же самое относится и к вычитанию:
// рЗ - Point.operator - (pi. р2)
рЗ = pi - р2:
Если вы запустите на выполнение программу с нашим примером, должен получиться результат, представленный па рис. 5.2.
E D:\CShai'pBook\Labs\Chapter 4\Dvei-LoadOp&\biii\Deb.„MI3B
Here is the big r-.ii X ¦ Ми V \H'--z МИ
Just -і 11 і ти- j)u int: X^:.: 48 V pos: 40
^V;.:.;; any Ь:|у Ui.- CWiI ІІІІІІ**
M
Рис. 5.2. Применяем перегрузку операторов
Перегрузка операторов может быть очень удобной, когда мы хотим заставить свои пользовательские типы реагировать на те же операторы, что и встроенные типы. Однако следует помнить, что подавляющее большинство языков программирования (и в их числе Java) перегрузку операторов не поддерживают. Требования обеспечить возможность перегрузки операторов нет и в Common Language Specification. Поэтому если вы работаете с большим проектом, разные модули которого созданы на разных языках, будьте готовы столкнуться с тем, что в некоторых модулях использовать перегрузку операторов будет невозможно.
Из этой ситуации есть очевидный выход — сделать так, чтобы каждому перегруженному оператору соответствовал обычный метод с «нормальным» названием. В модулях, написанных на языках, поддерживающих перегрузку операторов, будут использоваться соответствующие операторы, а в остальных модулях — самые обычные методы со стандартными названиями. Для нашего класса Point такое решение может выглядеть следующим образом:
// Кроне перегруженного оператора, в этом определении класса предусмотрен Ш обычный метод с теми же возможностями public class Point
II Метод AddPoints работает точно так же, как перегруженный оператор сложения public static Point AddPoints (Point pi. Point p2)
Предыдущая << 1 .. 91 92 93 94 95 96 < 97 > 98 99 100 101 102 103 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100