Это имеет , чтобы быть виртуальным (и Джон Скит уже вынул спецификацию, чтобы доказать, что это есть ), потому что, учитывая ссылку на абстрактный базовый класс, должна быть вызвана реализация конкретного производного класса. Например, учитывая классическую иерархию животных:
abstract class Animal{
public abstract void Speak();
}
class Cat : Animal{
public override void Speak(){Console.WriteLine("meow");}
}
class Dog : Animal{
public override void Speak(){Console.WriteLine("bark");}
}
Функция, которая принимает объект Animal
и вызывает его метод Speak
, не будет знать, какую реализацию вызывать, если функция не была виртуальной.
static void TalkToAnimal(Animal a){
Console.WriteLine("Hello, animal.");
a.Speak();
}
Обратите внимание, что реализации интерфейса не виртуальные по умолчанию. Поскольку интерфейс работает не так, как класс, истинный полиморфизм не нужен, чтобы найти реализацию метода интерфейса.