Перегрузка.
В объектно-ориентированном программировании перегрузкой называют практику придания функции более чем одного значения. Этот термин означает, что на один и тот же идентификатор нагружено несколько функций. Перегруженные функции уже не различимы по одному только идентификатору (он у них одинаковый).
В самом общем смысле перегрузка представляет собой дополнительный способ различать функции с одинаковыми названиями.
Почему следует использовать перегрузку.
В английском языке, как, очевидно, и во многих других языках, одни и те же глаголы, используемые в разных контекстах, означают разные действия. Рассмотрим глагол играть. Он используется в следующих ситуациях:
· Играть на пианино
· Играть в баскетбол
· Играть с игрушкой
· Играть на бирже
Говоря в терминах языка программирования, слово играть, используемое как глагол, перегружено. Каждый контекст имеет своё значение, но все случаи использования всё-таки концептуально связаны. Повторное использование одних и тех же глаголов, в разных, но схожих ситуациях не только обеспечивает важные подсказки в процессе мышления, но и сокращает количество слов, необходимых в языке.
В объектно-орентированном программировании простота очень важна. Чем меньше вы знаете о системе и её использовании, тем лучше. То же самое касается и программного кода. Чем меньше деталей нужно указать при вызове метода, тем лучше. Это позволяет компилятору варьировать вызовы методов и манипулировать объектами. Рассмотрим метод Display(), которая принимает и отображает аргумент на экране монитора. Например, можно написать так:
Display("\nНапечатай это, пожалуйста");
Display(123456789);
Display(3.14159);
Было бы прекрасно, если бы этот метод работал с любым аргументом, а всю дополнительную работу выполнял компилятор. В конце концов, компилятор видит типы всех аргументов, используемых в списке параметров, и должен уметь работать с этой информацией. С помощью перегрузки можно написать три метода так, что приведённый код будет работоспособен. Для этого каждый метод определяется отдельно от других и отличается от них количеством и типом принимаемых аргументов. В таких случаях говорят, что метод Display() перегружен, так как её идентификатор ассоциируется с более, чем одним методом.
Перегрузка придаёт языку программирования особую гибкость, предоставляя тем самым возможность пользователям писать программы с меньшими усилиями. Таким образом, перегрузка обеспечивает дружественность по отношению к программисту.
Но достоинства перегрузки не достаются даром, поскольку они повышают сложность компилятора, которому теперь приходится больше "думать". Проблема с перегруженными словами в языках программирования как, впрочем, и в естественных языках, подобных английскому, заключается в том, что семантика становится контекстно-зависимой. Другими словами, точное значение перегруженного идентификатора можно понять только после рассмотрения нескольких соседних слов. Для методов такими соседними словами являются количество и тип аргументов, используемых при вызове метода. Таким образом, перегрузка применима только к методам, но не к переменным, классам или типам.
Перегрузка методов.
Как уже говорилось, перегруженные функции используют один и тот же идентификатор, но различаются количеством и типом аргументов. При этом тип возвращаемого значения роли не играет. Таким образом, две функции void Display(int); и long Display(int); не различимы и приведут к ошибке компиляции. Перегруженные функции вовсе не обязательно должны быть членами класса. Можно перегружать как функции-члены, так и обычные функции.
Перегруженные методы.
Когда в классе объявляется несколько функций - членов с одним и тем же именем, то говорят, что имя функции в классе перегружено. Имя функции перегружено именно в классе, а не вообще. Другими словами, область видимости перегруженного имени - это всего один класс. Другие классы могут использовать то же имя, перегружая его иначе или не перегружая вообще. Разные классы - совершенно отдельные области видимости, и компилятор хранит их раздельно. Рассмотрим следующий код:
class Example
{
int value;
public:
public void Value(int v){ value=v; };
public void Value(){ return value; };
};
void main()
{
Example e;
e.Value(3);
int i = e.Value();
};
Класс Example имеет два перегруженных метода, один - для записи, а другой - для чтения переменной. Для перегруженных методов это обычное явление. Без применения механизма перегрузки пришлось бы использовать два отдельных метода, такие как PutValue() и GetValue(). Но язык С# позволяет это упростить. Перегруженные методы должны отличаться по одному или обоим описанным ниже пунктам:
1. методы должны иметь разное количество аргументов.
2. Отличие должно быть, по крайней мере, в одном из типов аргументов.
Как уже говорилось, тип возвращаемого значения не является фактором различия перегруженных методов.