Перегрузка.

В объектно-ориентированном программировании перегрузкой называют практику придания функции более чем одного значения. Этот термин означает, что на один и тот же идентификатор нагружено несколько функций. Перегруженные функции уже не различимы по одному только идентификатору (он у них одинаковый).

В самом общем смысле перегрузка представляет собой дополнительный способ различать функции с одинаковыми названиями.

Почему следует использовать перегрузку.

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

· Играть на пианино

· Играть в баскетбол

· Играть с игрушкой

· Играть на бирже

Говоря в терминах языка программирования, слово играть, используемое как глагол, перегружено. Каждый контекст имеет своё значение, но все случаи использования всё-таки концептуально связаны. Повторное использование одних и тех же глаголов, в разных, но схожих ситуациях не только обеспечивает важные подсказки в процессе мышления, но и сокращает количество слов, необходимых в языке.

В объектно-орентированном программировании простота очень важна. Чем меньше вы знаете о системе и её использовании, тем лучше. То же самое касается и программного кода. Чем меньше деталей нужно указать при вызове метода, тем лучше. Это позволяет компилятору варьировать вызовы методов и манипулировать объектами. Рассмотрим метод 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. Отличие должно быть, по крайней мере, в одном из типов аргументов.

Как уже говорилось, тип возвращаемого значения не является фактором различия перегруженных методов.