Термины «перегрузка» и «переопределение» звучат очень похоже (поэтому они иногда противопоставляются друг другу), но связаны ли эти два понятия технически?

  1. Связаны ли термины «перегрузка» и «переопределение»?

Термин «перегрузка» зависит от определения «сигнатуры метода». У меня есть аналогичный вопрос.

  1. (связанный) Термин "подпись метода "тоже относится к" переопределению "?
3
Anton Lyhin 21 Фев 2016 в 23:25

2 ответа

Лучший ответ

Перегрузка имеет несколько функций с одинаковым именем, но разными параметрами. Например

Например

void SayHi(string name) { ... }
void SayHi(string, int age) {.... }

Это перегрузки.

Переопределение «заменяет» существующую функцию, поэтому вы берете существующую функцию и предоставляете совершенно новую с тем же именем и теми же параметрами.

class Person
{
    public virtual void SayHi(string name)
    {
        // ....
    }
}

class Teenager : Person
{
    public override void SayHi(string name)
    {
        // ....
    }
}

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

Сигнатура метода связана с перегрузкой таким образом, что перегрузки должны иметь разные сигнатуры метода.

8
Bogey 21 Фев 2016 в 20:32

Под перегрузкой понимается наличие нескольких версий одного и того же метода или имени функции, каждая из которых имеет разные типы аргументов, например. init( int, int ) и init( const char * ) в C ++ с реализациями, специфичными для типов аргументов. Компилятор выберет версию для вызова на основе аргументов, которые вы используете в конкретном вызове. Сигнатура метода относится к типам и порядку аргументов. Для перегрузки сигнатуры методов разных версий метода должны различаться.

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

3
Todd Knarr 21 Фев 2016 в 20:33