Это способность объектов с одинаковым интерфейсом (или базовым классом) вести себя по-разному в зависимости от конкретного типа объекта, с которым работает программа.С другой стороны. Это же можно сказать и с другой стороны: это свойство, позволяющее использовать объекты разных типов через общий интерфейс, что упрощает разработку и делает код более гибким и переносимым.
Основа заключается в том, что у нас есть базовый класс или интерфейс и может быть множество других потомков, которые могут работать совершенно по другому, но мы со всеми работаем одинаково через базовый класс.
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 и звук будет разный, в зависимости от того, какой именно объект мы получили - кошка или собака
Ключевые моменты:
- Основан на наследовании и переопределении методов.
- Может решаться во время выполнения (динамический полиморфизм).