Что означает «Перегрузка» / «Перегрузка» / «Перегрузка»?
-
08-07-2019 - |
Вопрос
Что означает "Перегружен" / "Перегружен" значит в отношении программирования?
Решение
Это означает, что вы предоставляете функцию (метод или оператор) с тем же именем, но с другой подписью. Например:
void doSomething();
int doSomething(string x);
int doSomething(int a, int b, int c);
Другие советы
Основная концепция
Перегрузка или "перегрузка метода" это имя концепции наличия более одного метода с одинаковым именем, но с разными параметрами.
Например, Класс System.DateTime в c # имеет более одного метода 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
в C ++ или override
в Delphi и C #.
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)
Как и в обычном использовании, он ссылается на что-то (в данном случае имя метода), выполняя более одной работы.
Перегрузка - это версия мультиметода из CLOS и других языков для бедного человека а>. Это сбивает с толку один.
Переопределение - это обычный ОО. Это идет с наследованием, мы также называем это переопределением (например, в https: / /stackoverflow.com/users/3827/eed3si9n ответ Линия
предоставляет специальное определение Draw ()
.