Полиморфизм - это средство, которое позволяет языку / программе принимать решения во время выполнения, какой метод вызывать, основываясь на типах параметров, отправленных этому методу.
Количество параметров, используемых языком / средой выполнения, определяет «тип» полиморфизма, поддерживаемого языком.
Одиночная отправка - это тип полиморфизма, при котором для определения вызова используется только один параметр (получатель сообщения - this
или self
).
Множественная диспетчеризация - это тип полиморфизма, в котором при определении параметров для вызова метода используются несколько параметров. В этом случае приемник, а также типы параметров метода используются, чтобы указать, какой метод вызывать.
Таким образом, вы можете сказать, что полиморфизм - это общий термин, а множественная и единичная отправка - это конкретные типы полиморфизма.
Добавление: перегрузка происходит во время компиляции. Он использует информацию о типе, доступную во время компиляции, чтобы определить, какой тип метода вызывать. Одна / несколько отправок происходит во время выполнения.
Пример кода:
using NUnit.Framework;
namespace SanityCheck.UnitTests.StackOverflow
{
[TestFixture]
public class DispatchTypes
{
[Test]
public void Polymorphism()
{
Baz baz = new Baz();
Foo foo = new Foo();
// overloading - parameter type is known during compile time
Assert.AreEqual("zap object", baz.Zap("hello"));
Assert.AreEqual("zap foo", baz.Zap(foo));
// virtual call - single dispatch. Baz is used.
Zapper zapper = baz;
Assert.AreEqual("zap object", zapper.Zap("hello"));
Assert.AreEqual("zap foo", zapper.Zap(foo));
// C# has doesn't support multiple dispatch so it doesn't
// know that oFoo is actually of type Foo.
//
// In languages with multiple dispatch, the type of oFoo will
// also be used in runtime so Baz.Zap(Foo) will be called
// instead of Baz.Zap(object)
object oFoo = foo;
Assert.AreEqual("zap object", zapper.Zap(oFoo));
}
public class Zapper
{
public virtual string Zap(object o) { return "generic zapper" ; }
public virtual string Zap(Foo f) { return "generic zapper"; }
}
public class Baz : Zapper
{
public override string Zap(object o) { return "zap object"; }
public override string Zap(Foo f) { return "zap foo"; }
}
public class Foo { }
}
}