Программирование на C# (Си Шарп) - ООП в .NET - Когда использовать перегрузку

Программирование на C# - ООП C#

ООП С 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, содержащей строку местоположения наряду с географическими координатами с возвратом этой структуры из вызова метода, что позволило бы избежать перегрузки.


 

Добавить комментарий


Защитный код
Обновить