Страницы

Поиск по вопросам

понедельник, 25 февраля 2019 г.

Перегрузка методов с#

Чем вредна и полезна перегрузка методов в с#?


Ответ

Возьмем для начала язык не поддерживающий перегрузку, например C. Допустим нужно две функции, выполняющих вычисление одной и той же величины, но с использованием разного набора параметров. Как такое реализовать? Создать две функции с разными именами. При этом желательно сохранить осмысленность названий и показать факт того, что две, а может и больше, функции по сути выполняют одно и тоже и отличаются только именем.
Теперь вернемся к языкам поддерживающим перегрузку. По сути, все осталось как и раньше, но для одинаковых по сути функций/методов есть возможность сохранить одно имя на всех.
Такой эффект удалось получить расширив понятие имени функции, включающего только собственно имя, до сигнатуры функции/метода, которая, кроме имени, включает также список типов параметров и тип возвращаемого значения. Имена параметров в сигнатуру не входят. Это позволяет различать функции имеющие одинаковые имена, но различные по величине и составу наборы параметров. Тип возвращаемого значения, не смотря на то, что является частью сигнатуры, при перегрузке не рассматривается (MSDN).
Разумеется такое решение не без недостатков. Например, мы не сможем таким образом создать в одной области видимости две функции для вычисления какой либо физической величины по двум разным формулам, но с одинаковым числом и типом параметров. С точки зрения физики, это два разных метода вычисляющих одно и тоже значение, но, для существующей модели перегрузки методов, они не различимы.
Также есть некоторые особенности поведения перегруженных методов при наследовании в сравнении с другими языками, но это уже отдельная тема. Для ознакомления с проблемой можно почитать эту статью
C# поддерживает также значения параметров по умолчанию, которые позволяют не создавать множество перегруженных методов для различного набора одних и тех же параметров.

Комментариев нет:

Отправить комментарий