Ответ 1
Это означает, что вы предоставляете функцию (метод или оператор) с тем же именем, но с другой подписью. Например:
void doSomething();
int doSomething(string x);
int doSomething(int a, int b, int c);
Что означает "перегрузка" / "перегрузка" в отношении программирования?
Это означает, что вы предоставляете функцию (метод или оператор) с тем же именем, но с другой подписью. Например:
void doSomething();
int doSomething(string x);
int doSomething(int a, int b, int c);
Основная концепция
Перегрузка или "перегрузка метода" - это название понятия наличия нескольких методов с тем же именем, но с разными параметрами.
Например, Класс System.DateTime в С# содержит более одного метода ToString. Стандартный ToString использует культуру по умолчанию для системы, чтобы преобразовать дату и время в строку:
new DateTime(2008, 11, 14).ToString(); // returns "14/11/2008" in America
в то время как другая перегрузка одного и того же метода позволяет пользователю настроить формат:
new DateTime(2008, 11, 14).ToString("dd MMM yyyy"); // returns "11 Nov 2008"
Иногда имя параметра может быть одинаковым, но типы параметров могут отличаться:
Convert.ToInt32(123m);
преобразует десятичное число в int, а
Convert.ToInt32("123");
преобразует строку в int.
Разрешение перегрузки
Для поиска лучшей перегрузки для вызова компилятор выполняет операцию с именем "разрешение перегрузки". В первом примере компилятор может найти лучший метод просто путем сопоставления счетчика аргументов. Во втором примере компилятор автоматически вызывает десятичную версию метода replace, если вы передаете десятичный параметр и вызывается строковая версия, если вы передаете строковый параметр. Из списка возможных выходов, если компилятор не может найти подходящего для вызова, вы получите ошибку компилятора, например: "Наилучшая перегрузка не соответствует параметрам...".
Вы можете найти много информации о том, как разные компиляторы выполняют разрешение перегрузки.
Функция перегружена, когда она содержит несколько подписи. Это означает, что вы можете вызвать его с разными типами аргументов. Например, у вас может быть функция для печати переменной на экране, и вы можете определить ее для разных типов аргументов:
void print(int i);
void print(char i);
void print(UserDefinedType t);
В этом случае функция print() будет иметь три перегрузки.
Это означает, что имеют разные версии той же функции, которые принимают разные типы параметров. Такая функция "перегружена". Например, выполните следующую функцию:
void Print(std::string str) {
std::cout << str << endl;
}
Вы можете использовать эту функцию для печати строки на экране. Однако эту функцию нельзя использовать, если вы хотите напечатать целое число, тогда вы можете сделать вторую версию функции, например:
void Print(int i) {
std::cout << i << endl;
}
Теперь функция перегружена, и какая версия функции будет вызываться, зависит от параметров, которые вы ей даете.
Другие ответили, что такое перегрузка. Когда вы начинаете, это путается с переопределением/переопределением.
В отличие от перегрузки переопределение определяет метод с той же сигнатурой в подклассе (или дочернем классе), который переопределяет реализацию родительских классов. Некоторый язык требует явной директивы, такой как virtual
функция-член в С++ или override
в Delphi и С#.
using System;
public class DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("I'm just a generic drawing object.");
}
}
public class Line : DrawingObject
{
public override void Draw()
{
Console.WriteLine("I'm a Line.");
}
}
Перегруженный метод - это один вариант с несколькими параметрами для числа и типа параметров. Например:
foo(foo)
foo(foo, bar)
оба будут делать относительно одно и то же, но у одного есть второй параметр для дополнительных опций
Также вы можете использовать один и тот же метод для разных типов
int Convert(int i)
int Convert(double i)
int Convert(float i)
Как и в обычном использовании, он ссылается на что-то (в данном случае на имя метода), выполняя несколько заданий.
Перегрузка - это версия бедного человека multimethods из CLOS и других языков. Это запутанное.
Переопределение является обычным OO. Это связано с наследованием, мы также называем это переопределением (например, в fooobar.com/info/360479/... Line
предоставляет специализированное определение Draw()
.