Это способность объектов с одинаковым интерфейсом (или базовым классом) вести себя по-разному в зависимости от конкретного типа объекта, с которым работает программа.С другой стороны. Это же можно сказать и с другой стороны: это свойство, позволяющее использовать объекты разных типов через общий интерфейс, что упрощает разработку и делает код более гибким и переносимым.
Основа заключается в том, что у нас есть базовый класс или интерфейс и может быть множество других потомков, которые могут работать совершенно по другому, но мы со всеми работаем одинаково через базовый класс.
class Animal
{
public virtual void Speak()
{
Console.WriteLine("Базовый звук животного");
}
}
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("Гав");
}
}
class Cat : Animal
{
public override void Speak()
{
Console.WriteLine("Мяу");
}
}
class Program
{
static void MakeSound(Animal animal)
{
animal.Speak();
}
static void Main()
{
Animal a1 = new Dog();
Animal a2 = new Cat();
MakeSound(a1); // Гав
MakeSound(a2); // Мяу
}
}
В этом примере мы создаём три класса - базовый Animal и два потомка - Dog (Собака) и Cat (Кошка). Собака и кошка делают разные звуки, но чуть ниже в методе MakeSound нам всё равно, какого животного нам передали в качестве параметра. Мы просто вызываем метод Speak и звук будет разный, в зависимости от того, какой именно объект мы получили - кошка или собака
Ключевые моменты:
- Основан на наследовании и переопределении методов.
- Может решаться во время выполнения (динамический полиморфизм).