2075 / C# / Класи / Поліморфізм / Приклад для співбесіди
Просто наслідування (без поліморфізму) У всіх нащадків класу Animal одна і та ж реалізація методу getSound() class Animal { public void getSound() { Console.WriteLine("Абстрактний звук"); } } class Dog : Animal { } class Cat : Animal { } class Cow : Animal { } ----------------------------- Animal[] animals = new Animal[3]; Dog dog = new Dog(); Cat cat = new Cat(); Cow cow = new Cow(); animals[0] = dog; animals[1] = cat; animals[2] = cow; foreach (var x in animals) { x.getSound(); }
Абстрактний звук
Абстрактний звук
Абстрактний звук
Абстрактний звук
Абстрактний звук
Наслідування (з поліморфізмом) Додаємо специфікатори virtual та override і отримуємо різну реалізацію методу getSound() class Animal { public virtual void getSound() { Console.WriteLine("Абстрактний звук"); } } class Dog : Animal { public override void getSound() { Console.WriteLine("Woof"); } } class Cat : Animal { public override void getSound() { Console.WriteLine("Meow"); } } class Cow : Animal { public override void getSound() { Console.WriteLine("Moo"); } } ----------------------------- Animal[] animals = new Animal[3]; Dog dog = new Dog(); Cat cat = new Cat(); Cow cow = new Cow(); animals[0] = dog; animals[1] = cat; animals[2] = cow; foreach (var x in animals) { x.getSound(); }
Woof
Meow
Moo
Meow
Moo
Ми звертаємося до кожного звіра узагальнено, не знаючи до якого конкретно звіра з масиву ми звернулися, але завдяки поліморфізму кожен об'єкт поводить себе так, як ми перевизначили його метод. Ми перекриваємо стару реалізацію методу - новою. Приведення до базового типу Cow cow = new Cow(); Animal animal = cow; // Upcasting Ми тепер не знаємо, який конкретний екземляр зберігається в animal, а нам і не треба знати, у цьому вся сіль (весь смак) animal.getSound();
Moo