Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка методов 
V
    Опции темы
MasterOfCode
Дата 22.5.2008, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 2
Всего: 27



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


--------------------
user posted image
PM ICQ   Вверх
Kefir
Дата 22.5.2008, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: нет
Всего: 87



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


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

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

PM MAIL WWW Skype   Вверх
MasterOfCode
Дата 22.5.2008, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 2
Всего: 27



Ыыы... Часто пользовался, и не знал как называется )))


--------------------
user posted image
PM ICQ   Вверх
Ronin08
Дата 22.5.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



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

Код

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


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

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

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

--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
SmartBye
Дата 22.5.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



А что же тогда такое перегрузка переменной? о_О
PM MAIL   Вверх
QryStaL
Дата 22.5.2008, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



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

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


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
sobik
Дата 22.5.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 21.3.2008
Где: Киев, Украина.

Репутация: 1
Всего: 1



И мне тоже стало интересно smile 
PM MAIL   Вверх
Ronin08
Дата 22.5.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



Цитата

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  и т.д.?

Это сообщение отредактировал(а) Ronin08 - 22.5.2008, 22:11
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
SmartBye
Дата 22.5.2008, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



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

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


Ronin08, а откуда текстик?
PM MAIL   Вверх
Ronin08
Дата 23.5.2008, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



Цитата

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

А что? Погуглил! Точную ссылку не помню.
Честноговоря я редко встречаю  "Перегрузка операторов", но судя из текстика = Перегрузка мат операций!
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
MasterOfCode
Дата 23.5.2008, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 2
Всего: 27



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


--------------------
user posted image
PM ICQ   Вверх
QryStaL
Дата 23.5.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



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 >=.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
SmartBye
Дата 23.5.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



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

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

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

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

Это сообщение отредактировал(а) SmartBye - 23.5.2008, 09:50
PM MAIL   Вверх
MasterOfCode
Дата 23.5.2008, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 2
Всего: 27



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


--------------------
user posted image
PM ICQ   Вверх
Ronin08
Дата 23.5.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



Цитата

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

 smile да, здесь я поспешил.
 И еще, если перегружаете == и != , то также надо переопределить методы Equals() и GetHashCode() , иначе получите пркдупреждение кампилятора
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.