Показать сообщение отдельно

  #5  
Старый 31.08.2006, 15:24
NeuRonix
Познающий
Регистрация: 05.03.2006
Сообщений: 50
Провел на форуме:
647440

Репутация: 44
Отправить сообщение для NeuRonix с помощью ICQ
По умолчанию

Все разобрался, точнее, помогли, оказалось довольно просто.

На примере операции "+".
Этот символ обозначает разные операции.
Например 1+1 --- опирация сложения чисел (ответ 2)
А если "1" -- строка, то + будет складывать именно строки, а не их значения.
Алгоритм этого действия другой и в ответе уже будет "11" -- склейка этих строк.


Получается, что результат одной и той же операции зависит от того что мы складываем (это естественно).

По умолчанию, язык C# не в курсе как складываются точки (Point).
Поэтому его нужно этому учить:

код C#
public static Point operator +(Point cl1, Point cl2)

Внутри ты можешь поставить любую реализацию (даже попарно умножить их).
Мы только что научили C# складывать Точки.
Можно научить умножать Точку на число:

код C#
public static Point operator *(int cl1, Point cl2)

Можно эту же операцию применить к скалярному умножению точек:
код C#
public static int operator *(Point cl1, Point cl2)

И так далее....
В последних двух примерах мы и сталкиваемся с перегрузкой.
Т.е. Когда один и тот же оператор (*) имеет разные реализации (но!, что важно для разных аргументов).


Как же компилятор определяет какую реализацию выбрать?
Очень просто:
Если ты перемножаешь число и Точку (именно в этом порядке ), то нужно выбирать первую реализацию, если две точки, то вторую.

код C#
Point cl1 = new Point(1, 5);
Point cl2 = new Point(-8, 10);
int i = 5;


Point cl3 = i * cl2; // Можно было написать 5 * cl2
// cl3 = cl2 * i --- выдаст ошибку компиляции, ведь мы не написали (не определили),
// что делать если первый параметр точка, а второй число :thumbs-up

int j = cl1 * cl2;
 
Ответить с цитированием