|
ООП С Sharp - Когда использовать перегрузку
Обычно перегрузку метода стоит рассматривать, когда нужны несколько методов, принимающих различные параметры, но концептуально выполняющих одно и то же действие, как это делает Console.WriteLine() в предыдущем разделе. Ситуации, в которых обычно используется перегрузка, описаны в следующих подразделах.
Необязательные параметры Одной из частых причин перегрузки методов является необходимость сделать некоторые параметры метода необязательными и иметь значения по умолчанию, если клиентский код не специфицирует их явно. Например, рассмотрим такой код:
public void DoSomething(int x, int y)
{
// что-то делать
}
public void DoSomething(int x)
{
DoSomething(x, 10);
}
Эти перегрузки позволят клиентскому коду вызывать DoSimething(), передавая один обязательный параметр и один необязательный. Если необязательный параметр не указан, применяется его значение по умолчанию — 10. Большинство современных компиляторов при этом используют вызов встраиваемых методов, поэтому никаких потерь производительности не происходит. И это, безусловно, справедливо и в отношении JIT-компилятора .NET.
Некоторые языки, включая Visual Basic и C++, позволяют явно специфицировать параметры по умолчанию при объявлении функций, используя синтаксис вроде public void DoSomething(int X, int Y=10). Язык C# не позволяет этого, тут приходится эмулировать параметры по умолчанию за счет представления множества перегрузок методов, как было показано в предыдущем примере.
Разные входные типы
Вы уже видели эту очень часто возникающую причину для определения перегрузок в примере Console.WriteLine().
Разные выходные типы
Эта ситуация встречается реже. Тем не менее, иногда может возникнуть необходимость в методе, который вычисляет или получает некоторую величину, и в зависимости от обстоятельств, нужно, чтобы она была возвращена более чем одним способом. Например, для компании-авиаперевозчика может понадобиться класс, представляющий расписание движения самолетов, и вы хотите определить метод, который должен сообщать, где должно находиться воздушное судно в определенный момент времени. В зависимости от ситуации, может понадобиться, чтобы метод возвращал либо строковое описание положения (“над Атлантикой, по пути в Лондон”), либо географические координаты.
Невозможно определить перегрузки, различающиеся только типом возврата метода. Однако это можно сделать, используя параметр out. Поэтому вы можете поступить следующим образом:
void GetAircraftLocation(DateTime Time, out string Location)
{
...
}
void GetAircraftLocation(DateTime Time, out float Latitude,
out float Longitude)
{
...
}
Обратите, однако, внимание, что в большинстве случаев применение перегрузок для получения разных out-параметров не ведет к архитектурно ясному дизайну. В предыдущем примере более правильный дизайн, возможно, включал бы определение структуры Location, содержащей строку местоположения наряду с географическими координатами с возвратом этой структуры из вызова метода, что позволило бы избежать перегрузки.
|