В чём разница между абстрактным методом и виртуальным? C#

Чем отличается абстрактный метод от виртуального? Когда нужно их использовать?

абстрактный метод не может иметь тело (функциональность), может быть объявлена только в теле абстрактного класса, требует от производных классов её реализации (переопределения).

виртуальны метод может иметь функциональность, может быть объявлен в классе/структуре/абстрактном классе, не требует от производных классов его переопределения (но при этом может быть переопределён).

абстрактные методы используются для описания методов, которые должны иметь все производные классы, виртуальный же метод предоставляет возможность переопределить метод в производном классе (изменить поведение объекты - через них в C# реализуется классическая форма полиморфизма). Из этого стоит и выходить при выборе какой вид метода (абстрактный или виртуальный) нужно использовать.

Также нужно добавить ещё следующее:

  • все члены в интерфейсах являются абстрактными
  • если рассматривать разницу между абстрактным и виртуальным методом, то абстрактный метод- это тот же виртуальный метод не имеющий своего тела (оно у него пустое { }) и требующий своего переопределения в классах потомках.