Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

например. Перегрузки: (Хорошо)

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) { ... }

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

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

Ответ 2

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

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

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

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

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

Но я действительно думаю, что есть стоимость, в точности кодирования, а также в пользу.

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

    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; }
        }
    }
    
  • Вы можете захотеть, чтобы ваш метод был подходящим для нескольких типов объектов. ех. Метод Console.WriteLine() способен записывать пустые строки, bool, int, string, char [], float и т.д. На консоли. Это стало возможным благодаря перегрузке функций.

Ответ 6

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

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

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

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

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

class Demo{
  int height;
  int width;
}

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

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

Demo addUs(Demo a Demo b){
  Demo this;
  this.height = a.height + b.height;
  this.width = a.width + b.width;
  return this;
}

Ответ 7

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

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

Ответ 9

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

Ответ 10

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