В чем польза / преимущество перегрузки функций? - PullRequest
23 голосов
/ 27 июля 2010

В чем польза / преимущество перегрузки функций?

Ответы [ 10 ]

21 голосов
/ 27 июля 2010

ИМО, основное преимущество - это согласованность в именовании методов / функций, которые логически выполняют очень похожие задачи и немного различаются при принятии разных параметров.Это позволяет повторно использовать одно и то же имя метода в нескольких реализациях.

Например, перегрузки: (Хорошие)

function Person[] FindPersons(string nameOfPerson) { ... }
function Person[] FindPersons(date dateOfBirth) { ... }
function Person[] FindPersons(int age, string dogsName) { ... }

Предпочтительнее функций с уникальными именами: (Хуже)

function Person[] FindPersonsByName(string nameOfPerson) { ... }
function Person[] FindPersonsByDOB(date dateOfBirth) { ... }
function Person[] FindPersonsByAgeAndDogsName(int age, string dogsName) { ... }

Таким образом, кодер, пишущий клиент, который вызывает / использует эти функции, может работать на более высоком уровне концептуального мышления («Мне нужно найти человека») и ему не нужно запоминать / находить надуманную функциюname.

При статической типизации компилятор будет оставлен в соответствии с применимой перегрузкой на основе параметров использования.Для динамической типизации такое же совпадение будет происходить во время выполнения, что может привести к сбою, если не найдено подходящего совпадения.

7 голосов
/ 27 июля 2010

Очень правильный вопрос.

Вы получаете согласованность в именовании, но за счет двусмысленности относительно точной реализации .

  • Реальная проблемачеловеческая память для имен методов, верно?нам легче запомнить имена, которые обычно используются.

  • и экономия при наборе текста, что позволяет использовать более короткие имена методов?меньшее количество разных имен означает (математически), что само имя несет меньше информации.

Эти две проблемы не должны вызывать беспокойства, поскольку в средах IDE поиск / угадывание / вставка имен методов происходит быстро на основепервые несколько символов и типы параметров / возвращаемых значений.

Но я думаю, что в точности кодирования есть и выгода, и выгода.

6 голосов
/ 27 июля 2010

Перегрузка - это форма полиморфизма.Это позволяет программисту писать функции, которые концептуально делают одно и то же для разных типов данных без изменения имени.(Это также позволяет программисту писать функции, которые делают концептуально разные вещи в зависимости от параметров, но это очень плохая идея.)

Это обеспечивает последовательность в нотации, которая хороша как для чтения, так и для написания кода.Ввод / вывод - это очень распространенное использование.В большинстве распространенных языков есть функция или оператор, который выводит все, что вам нравится, например, printf() и kin в C, operator<<() в C ++, PRINT в старой ОСНОВЕ, которую я использовал, что угодно.Языки, которым требуются такие функции, как printint(), printstring(), printfloat() и т. П., Никогда не завоевывали популярность.

Он очень хорошо работает с шаблонами C ++ и любой другой конструкцией, где вы не обязательно знаете, чтотип переменной на момент написания кода.

4 голосов
/ 27 июля 2010
  1. Несколько вариантов поведения для одной и той же функции в зависимости от параметров.
  2. Ваша функция может захотеть работать с некоторыми дополнительными деталями.Например, в следующем примере требуется добавить члена к объекту Members, с любой детализацией, которую знает пользователь.Здесь age - это минимальная деталь для создания члена, age и memberOf необязательны.[Примечание: определение функций не приводится во фрагменте кода.]

    public class Members
    {
        public System.Collections.Generic.List<Member> TeamMembers;
    
        public AddMember(Member m) {}
        public AddMember(string name) {}
        public AddMember(string name, int age) {}
        public AddMember(string name, int age, string[] memberOf) {}
    
        public class Member
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public string[] MemberOf { get; set; }
        }
    }
    
  3. Возможно, вы захотите, чтобы ваш метод подходил для нескольких типов объектов.ех.Метод Console.WriteLine () может записывать на консоли пустую строку, bool, int, string, char [], float и т. Д.Это стало возможным из-за перегрузки функции.

3 голосов
/ 27 июля 2010

Функция / метод иногда может принимать различные виды параметров для выполнения своей работы. Это время перегрузки функции. В противном случае вам придется иметь разные функции для одинаковой функциональности , что приводит к путанице и плохой практике.

  • Конструкторы являются функциями, поэтому они могут быть перегружены. Это очень удобно.
  • Когда вы впервые сталкиваетесь с перегрузкой, легко переусердствовать, думая, что вы оказываете будущим разработчикам услугу, предлагая им более удобные опции. Постарайся избежать этого. Ненужные перегрузки могут привести в замешательство будущих разработчиков и привести к ненужному обслуживанию кода.
1 голос
/ 27 июля 2010

специальный полиморфизм это хороший материал !!

1 голос
/ 27 июля 2010

Иногда у вас есть несколько способов выполнить одно и то же в зависимости от контекста и доступных входных данных. Для статических языков со строгим типом определения функций могут быть довольно жесткими и должны быть явно определены заранее.

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

1 голос
/ 27 июля 2010

Обеспечивает множественное поведение одного и того же объекта по отношению к атрибутам объекта.

Например, метод с именем addUs(a,b) добавляет a и b.

Таким образом, определение будетbe:

int addUs(int a, int b){
  return a+b;
}

Но теперь, если вы хотите, чтобы ваши аргументы были объектами класса, скажите:

class Demo{
  int height;
  int width;
}

Вы хотите, чтобы та же функция addUs() возвращала новый объект, который быимеют атрибуты height и width, имеющие значения как сумму высоты и ширины переданных 2 аргументов.

Итак, теперь определение будет:

Demo addUs(Demo a Demo b){
  Demo this;
  this.height = a.height + b.height;
  this.width = a.width + b.width;
  return this;
}
0 голосов
/ 23 января 2013

Это механизм функции с тем же именем, но выполняющий разные задачи на разных экземплярах. Мы легко запоминаем имена, которые обычно используются.

0 голосов
/ 27 июля 2010

Возможно, вы захотите сделать похожие вещи в коде с разными параметрами. Если бы вам пришлось давать каждой функции свое имя, читаемость кода была бы очень плохой.

...