C# Поліморфізм – Приклад для співбесіди

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

 


 
Ми звертаємося до кожного звіра узагальнено, не знаючи до якого конкретно звіра з масиву ми звернулися, але завдяки поліморфізму кожен об'єкт поводить себе так, як ми перевизначили його метод.
Ми перекриваємо стару реалізацію методу - новою.

Приведення до базового типу

Cow cow = new Cow();

Animal animal = cow; // Upcasting

Ми тепер не знаємо, який конкретний екземляр зберігається в animal,
а нам і не треба знати, у цьому вся сіль (весь смак)

animal.getSound();

 

Moo