ГЛАВНАЯ     АРХИВ     НАПИСАТЬ АДМИНУ     ПОДПИСАТЬСЯ НА RSS     ВОЙТИ      

Поиск

Категории

Облако тегов

  << Предыдущий пост       Следующий пост >>  
От: ironMan
9. августа 2011 20:39

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



using System;

class Log
{
public Log(string fileName)
{
/* Open fileName and seek to end */
...
}
public void WriteEntry(string entry)
{
Console.WriteLine(entry);
}
public void WriteEntry(int resourceld)
{
Console.WriteLine("получить строку no id ресурса и вывести в log")
}
}

class OverloadinglApp
{
public static void Main()
{
Log log = new Log ("My File");
log.WriteEntry("Строка один");
log.WriteEntry(42) ;
}
}



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



using System;

class File
{
}

class CommaDeiimicedFile
{
public CommaDelimitedFile(String fileName)
{
Console.NriteLine("Constructed with a file name") ;
}
public CommaDelimitedFile(File file)
{
Console.WriteLine("Constructed with a file object") ;
}
}

class Overloading2App
{
public static void Main()
{
File file = new File();
CommaDelimitedFile file2 = new CommaDelimitedFile (file);
CommaDelimitedFile file3 = new CommaDelimitedFile("Some file name");
}
}



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



using System;

class Overloading3App
{
void Foo(double input)
{
Console.WriteLinef"OverloadingЗАрр.Foo(double)");
}

/* ERROR here */
double Foo(double input)
{
Console.WriteLine("0verloading3App.Foo(double) (second version)")
}

public static void Main()
{
Overloading3App app = new 0verloading3App();
double i = 5;
app.Foo(i);
}



( отрывок из книги В. В. Лабор "Си Шарп: Создание приложений для Windows" )

Похожие записи


Замещение (new) методов в C#
Давайте сначала рассмотрим способы замещения функциональности базового класса в унаследованном методе. Начнем с базового класса, представляющего сотрудника. Чтобы максимально упростить пример, у этого класса будет единственный метод CalculatePay, который будет сообщать имя вызываемого метода и ничего более. Позднее это поможет нам определить, какие методы дерева насле...

Несколько методов Main в C#
В С# разработчиками включен механизм, позволяющий определять более одного класса с методом Main. Зачем это нужно? Одна из причин — необходимость поместить в ваши классы тестовый код. Затем, используя переключатель /main:<имя_Класса>, компилятору С# можно задавать класс, метод Main которого должен быть задействован. Вот пример, в котором создано два класса,...

Использование анонимных методов с делегатами в C#
Как то коллега спросил меня - "Как можно использовать анонимные методы с делегатом и когда мы это должны делать?" Используя анонимные методы вы уменьшаете кодовый оверхед при инстанцировании делегатов, урезая необходимость в создании отдельного метода. Вы можете использовать его для запуска мелких кусков кода, которые в другом случае потребовали бы именованног...

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




biuquote
  • Комментарий
  • Предпросмотр
Loading


  Сохранить комментарий