Двумя наиболее важными понятиями в C# являются виртуальные и абстрактные ключевые слова.

Какая разница?

Виртуальные методы

Виртуальные методы имеют реализацию и предоставляют производным классам возможность ее переопределения. Виртуальные методы могут иметь код, который обычно является реализацией чего-либо по умолчанию, и любые подклассы МОГУТ переопределять метод с помощью модификатора переопределения и предоставлять пользовательскую реализацию.

Абстрактные методы

Абстрактные методы не обеспечивают реализацию и заставляют производные классы переопределять метод. Таким образом, абстрактные методы не содержат реального кода, и подклассы ДОЛЖНЫ переопределять метод.

public abstract class E
{
    public abstract void AbstractMethod(int i);

    public virtual void VirtualMethod(int i)
    {
        // Default implementation which can be overridden by subclasses.
    }
}

public class D : E
{
    public override void AbstractMethod(int i)
    {
        // You HAVE to override this method
    }
    public override void VirtualMethod(int i)
    {
        // You are allowed to override this method.
    }
}

Резюме:

Виртуальные методы

  • Виртуальный метод может находиться в абстрактном и неабстрактном классе.
  • Нет необходимости переопределять виртуальный метод в производном, но это возможно.
  • Виртуальный метод должен иметь тело ….может быть переопределен с помощью «ключевого слова переопределения»

Абстрактные методы

  • Абстрактный метод находится в абстрактном классе и не имеет тела.
  • Абстрактный метод должен быть переопределен в неабстрактном дочернем классе.