Поиск

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

Перегрузка методов позволяет программистам на С# многократно использовать одни и те же имена методов, меняя лишь передаваемые аргументы. Это очень полезно по крайней мере в двух сценариях. Первый:
вам нужно иметь единое имя метода, поведение которого немного различается в зависимости от типа переданных аргументов. Допустим, у вас есть класс, отвечающий за протоколирование, позволяющий вашему приложению записывать на диск диагностическую информацию. Чтобы немного повысить гибкость класса, вы можете создать несколько форм метода Write, определяющих тип записываемой информации. Кроме собственно строки, подлежащей записи, метод также может принимать строку идентификатора ресурса. Без перегрузки методов вам пришлось бы реализовать отдельные методы наподобие WriteString и WriteFrom-Resourceld для каждой ситуации. Однако перегрузка методов позволяет реализовать оба эти метода под именем WriteEntry, они будут различаться лишь типом параметра:

using System;
class Log
{
public Log(string fileName)
{
// Открыть файл fileName и перейти в его конец.
}
public void WriteEntry(string entry)
{
Console.WriteLine(entry);
}
public void WriteEntry(int resourceld)
{
Console.WriteLine ("Получение строки на основе
идентификатора ресурса и запись
в журнал"); } }
class OverloadlngtApp
{
public static void Main()
{
Log log = new LogC'Mou файл");
log.WriteEntry("3anncb № 1");
log.WriteEntry(42); } }

Второй сценарий, в котором выгодно применять перегрузку метода, — использование конструкторов, которые в сущности представляют собой методы, вызываемые при создании экземпляра объекта. Допустим, вы хотите создать класс, который может быть построен несколькими способами. Например, он использует описатель (int) или имя (string) файла, чтобы открыть его. Поскольку правила С# диктуют, что у конструктора класса должно быть такое же имя, как и у самого класса, вы не можете просто создать разные методы для переменных каждого типа. Вместо этого нужно использовать перегрузку конструктора: using System;

class File
{
>
class CommaDeliinitedFile
{
public CommaDelimitedFile(String fileName) {
Console.WriteLine("Конструктор, использующий имя файла");
}
public CommaDelimitedFile(File file) {
Console.WriteLineC"Конструктор, использующий файловый объект"); }
}
class Overloading2App {
public static void HainQ {
File file = new File();
ConmaDelimitedFile flle2 = new ConnaDelinitedFile(file);
 ConnaDelinitedFile flleS = new ConmaDelinitedFile
CMiM некоторого файла");
> }

О перегрузке метода важно помнить следующее: список аргументов каждого метода должен отличаться. Поэтому следующий код не будет компилироваться, так как единственное различие между двумя версиями OverloadingSApp.Foo — тип возвращаемого значения:

using System;
class OverloadingSApp <
void Foo(double input)
{
Console.WriteLine("Overloading3App.Foo(double)");
>
// ОШИБКА: методы отличаются лишь типом возвращаемого значения.
// Код компилироваться не будет, double Foo(double input)
{
Console.WriteLine("Overloading3App.Foo(double)
(вторая версия)"); }
public static void Main()
{ ' 4 ^.._ OverloadingSApp app = new Overloading3App();
double i = 5; app.Foo(l); > }