Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Перегрузка методов


Автор: MasterOfCode 22.5.2008, 07:53
Очень часто встречается на форуме выражение "перегрузка методов", "перегрузка операторов"... Я не совсем понимаю что под ними подразумевается, поясните пожалуйста? smile

Автор: Kefir 22.5.2008, 07:56
эт если одна и та же функция определяется два раза с разными аргументами:
Код


private string MyFunc(string s) {
    return "Hello, " + s;
}

private string MyFunc() {
    return "Hello, mate";
}

Автор: MasterOfCode 22.5.2008, 08:02
Ыыы... Часто пользовался, и не знал как называется )))

Автор: Ronin08 22.5.2008, 16:38
Перегрузка операций:
Предположим у вас есть определенный класс, представляющий математическую матрицу. Матрицы можно перемножать и складывать подобно обычным числам.
Поэтому скорее всего вы захотите написать код подобно :

Код

Matrix a, b, c;
//предположим, что a, b, c инициализированы
Matrix d = c *(a +b);


С помощью перегрузки операций вы можете сообщить компилятору что делают + и * при использовании с Matrix, что позволит записать вышепреведенный код

Если бы вы определили методы выполняющие такие операции , то результат был бы менее интуитивно понятным 
Код

Matrix d= c.Multiply(a.Add(b));

Автор: SmartBye 22.5.2008, 16:48
А что же тогда такое перегрузка переменной? о_О

Автор: QryStaL 22.5.2008, 17:11
Ronin08, перегрузка операторов, а не операций. Операции - методы, а перегрузка методов имеет другой смысл.

SmartBye, первый раз слышу. Подробнее, что имеется в виду?  smile 

Автор: sobik 22.5.2008, 18:13
И мне тоже стало интересно smile 

Автор: Ronin08 22.5.2008, 21:53
Цитата

Ronin08, перегрузка операторов, а не операций. Операции - методы, а перегрузка методов имеет другой смысл.

Цитата

Перегрузка операторов 
Перегрузка - один из наиболее спорных механизмов современных языков
Перегрузка используется для сокращения записи операций над объектами 
Код

public static Matrix operator+
   (Matrix left, Matrix right)  { ... }
...
Matrix c = new Matrix();
c = a + b;

Перегрузка операторов - это один из наиболее спорных механизмов в современных языках. Некоторые программисты считают, что перегрузка операторов помогает только в создании трудно находимых ошибок. Другие программисты считают механизм перегрузки операторов полезным как раз из соображений улучшения читаемости кода. Как бы то ни было, перегрузка операторов стала неотъемлемой частью C#. Например, большинство классов в C# по умолчанию перегружают оператор сравнения (операция == практически всегда означает вызов метода Equals , унаследованного от System.Object ).

Перегрузка операторов обычно используется для того, чтобы сократить и привести к привычному виду запись операций над объектами, определенными программистом. Скажем, с объектами, представляющими математические или физические величины, обычно ассоциируются арифметические операции. Возьмем, в качестве примера квадратные матрицы - для них естественно ввести операции сложения и умножения. Без перегрузки операторов эти действия пришлось бы записывать таким образом: A.Add(B) или Matrices.Add (A,B) . И та, и другая формы записи несколько непривычны, так как традиционной формой является запись вида A+B . Попробуем реализовать ее на C#:

Код

public class Matrix {
   ...
   public static Matrix operator+ (Matrix left, Matrix right)
   {
      Matrix target = new Matrix();
      for (int i=0; i<n; i++)
         for (int j=0; j<n; j++)
            target[i,j] = left[i,j] + right[i,j];
      return target;
   }
При таком описании запись сложения матриц приобретает более знакомый вид:

Код

Matrix c = new Matrix();
c = a + b;
Таким же образом можно было бы реализовать умножение и деление матриц, сравнение и другие операции.

Как я понял перегрузка операторов = перегрузка математических операций!!!
Или какие операторы вы имеете в виду?
Неужели break, continue, if, for  и т.д.?

Автор: SmartBye 22.5.2008, 23:27
Цитата(QryStaL @  22.5.2008,  15:11 Найти цитируемый пост)
SmartBye, первый раз слышу. Подробнее, что имеется в виду? 

Это написал автор топика, вот мне и интересно стало... Но, судя по всему, он просто не понял, что сказал.


Ronin08, а откуда текстик?

Автор: Ronin08 23.5.2008, 00:00
Цитата

Ronin08, а откуда текстик? 

А что? Погуглил! Точную ссылку не помню.
Честноговоря я редко встречаю  "Перегрузка операторов", но судя из текстика = Перегрузка мат операций!

Автор: MasterOfCode 23.5.2008, 07:48
Такой вопрос, если я прегружу оператор "+" для матрицы, то оператор "+" изменится для всех, и мне нужно будет перегрузить его обратно?

Автор: QryStaL 23.5.2008, 09:03
MasterOfCode, Нет конечно. При перегрузке указываются типы операндов, для которых она осуществляется.

Добавлено через 11 минут и 8 секунд
Ronin08, операторы не ограничиваются математическими операциями:

+, -, !, ~, ++, --, true, false
 These unary operators can be overloaded.
 
+, -, *, /, %, &, |, ^, <<, >>
 These binary operators can be overloaded.
 
==, !=, <, >, <=, >=
The comparison operators, if overloaded, must be overloaded in pairs; that is, if == is overloaded, != must also be overloaded. The reverse is also true, and similar for < and >, and for <= and >=.

Автор: SmartBye 23.5.2008, 09:49
Цитата(MasterOfCode @ 23.5.2008,  05:48)
Такой вопрос, если я прегружу оператор "+" для матрицы, то оператор "+" изменится для всех, и мне нужно будет перегрузить его обратно?

Вот тут посмотрите - http://www.intuit.ru/department/pl/csharp/class/free/16/6.html

На мой взгляд удачный пример.  Автор создал класс рациональных чисел и перегрузил большинство возможных операторов, в том числе и логические, для работы с этими классами.

Описание класса находится в начале лекции.

Автор: MasterOfCode 23.5.2008, 10:57
Интересно, спасибо... smile
Но все таки я так понимаю что перегружают операторы только для читабельности кода? Или есть еще какие-то случаи когда следует перегрузить операторы?

Автор: Ronin08 23.5.2008, 12:11
Цитата

Ronin08, операторы не ограничиваются математическими операциями:

 smile да, здесь я поспешил.
 И еще, если перегружаете == и != , то также надо переопределить методы Equals() и GetHashCode() , иначе получите пркдупреждение кампилятора

Автор: source777 24.5.2008, 20:25
Цитата(MasterOfCode @  23.5.2008,  10:57 Найти цитируемый пост)
Но все таки я так понимаю что перегружают операторы только для читабельности кода? 
Да. А читабельность для кода - это самое важное.  smile 
Однако в данном случае не забывай, что код перегрузки оператора должен состоять из одной строки - вызова соответствующего метода, ибо не все .NET языки поддерживают перегрузку операторов...

Таким образом, если можно написать 
Код

Matrix d = c *(a +b);

то написать
Код

Matrix d= c.Multiply(a.Add(b));

тем более должно быть можно...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)