Является ли полиморфизм еще одним термином для перегрузки? - PullRequest
20 голосов
/ 05 мая 2009

Является ли полиморфизм еще одним термином для перегрузки?

Ответы [ 4 ]

43 голосов
/ 05 мая 2009

Нет; перегрузка - это создание метода с тем же именем с другим количеством параметров или с параметрами другого типа.

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

Перегрузка:

public class TestClass
{
    public void DoSomething( int a, int b ) {}

    public void DoSomething( int a, int b, string x ) {}
}

Полиморфизм:

public abstract class Base
{
    public abstract DoSomething();
}

public class A : Base
{
    public override DoSomething()
    {
         Console.WriteLine("I am A");
    }
}

public class B : Base
{
     public override DoSomething()
     {
         Console.WriteLine("I am B");
     }
}
10 голосов
/ 05 мая 2009

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

account = new BankAccount();
account = new BankAccount(1000);

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

5 голосов
/ 05 мая 2009

номер

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

Перегрузка метода - это функция, доступная в различных языках программирования, таких как Ada, C #, C ++, D и Java, которая позволяет создавать несколько методов с одинаковыми именами, которые отличаются от друг друга по типу входа и типу выхода функции.

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

Источник: Википедия.

1 голос
/ 05 мая 2009

Нет, это не так.

Перегрузка относится к созданию метода или оператора с тем же именем, но с разными параметрами и - в зависимости от языка - с разными типами возврата.

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

class BaseClass
{
     public void DoStuff(Int32 value) { } // Overloading

     public void DoStuff(String value) { } // Overloading

     public virtual void DoOtherStuff(String value) { }
}

class DerivedClass : BaseClass
{
    public override void DoOtherStuff(String value) { } // Overriding
}

Пример использования

BaseClass instance = null;

if (condition)
{
    instance = new BaseClass();
}
else
{
    instance = new DerivedClass();
}

// Using overloads
instance.DoStuff(4);
instance.DoStuff("four");

// Polymorphism - it depends on the actual type of the object
// referenced by the variable 'instance' if BaseClass.DoOtherStuff()
// or DerivedClass.DoOtherStuff() will be called at runtime.
instance.DoOtherStuff("other stuff");
...