Приклад для співбесіди
Просто наслідування (без поліморфізму)
У всіх нащадків класу 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();
}
Console.ReadLine();
Абстрактний звук
Абстрактний звук
Абстрактний звук
Наслідування (з поліморфізмом)
Додаємо специфікатори virtual та override і отримуємо різну реалізацію методу getSound()
у нащадків класу Animal
class Animal {
// virtual - поліморфний інтерфейс, який можна перевизначити в нащадках
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();
}
Console.ReadLine();
Woof
Meow
Moo
Ми звертаємося до кожного звіра узагальнено, не знаючи до якого конкретно звіра з масиву ми звернулися, але завдяки поліморфізму кожен об'єкт поводить себе так, як ми перевизначили його метод.
Ми перекриваємо стару реалізацію методу - новою.
Приведення до базового типу
Cow cow = new Cow();
Animal animal = cow; // Upcasting
// Ми тепер не знаємо, який конкретний екземляр зберігається в animal,
// а нам і не треба знати, у цьому вся сіль (весь смак)
animal.getSound();
Му- му