Абстрактная декларация метода - виртуальная?

В MSDN я обнаружил, что ошибка в использовании "виртуального" модификатора в объявлении абстрактного метода. Один из моих коллег, который должен быть довольно опытным разработчиком, хотя использует его в своем коде:

public abstract class BusinessObject   
{
    public virtual void Render(){}
    public virtual void Update(){}
}

И это правильно или нет?

Ответ 1

Это может иметь смысл, если абстрактный класс предоставляет необязательную точку, где унаследованные классы могут изменять поведение.

Таким образом, унаследованные классы не будут принудительно реализовывать его, но могут, если им нужно.

Обычно этот метод вызывается абстрактным классом:

public AddFoo(Foo f)
{
   // ...
   OnAddedFoo(f);
}

Здесь имеет смысл иметь OnAddedFoo как virtual, а не abstract.

Ответ 2

Я предполагаю, что MSDN означает, что вы не можете использовать модификатор virtual и abstract в методе одновременно.

Вы можете либо сделать

public virtual void Render() {}

что означает, что наследующий класс может переопределить этот метод.

Или вы можете сделать

public abstract void Render();

что означает, что наследующий класс должен переопределить этот метод.

Ответ 3

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

Это может помочь вашему пониманию увидеть их форматирование следующим образом:

public abstract class BusinessObject   
{
    public virtual void Render()
    {

    }

    public virtual void Update()
    {

    }
}

Ответ 4

Вы, вероятно, ссылаетесь на это предложение

Вы не можете использовать виртуальный модификатор со статическими, абстрактными, частными или переопределить модификаторы.

Это означает, что вы не можете использовать это в объявлении метода, метод не может быть одновременно виртуальным и абстрактным.

Итак, использование, которое вы представили, прекрасное, потому что класс является абстрактным, это означает, что вы можете иметь там некоторые абстрактные методы (без реализации, которые должны быть реализованы дочерним классом) и виртуальный метод (с реализацией, которая может быть переопределить в дочернем классе).

Ответ 5

Код Follwing означает, что вы должны использовать этот метод в унаследованном классе, и вы не можете поместить некоторую логику в тело абстрактного метода:

public abstract void Render();

Но если вы объявите виртуальный метод, вы можете поместить в него некоторую логику, а может ovveride

public virtual void Render()
{
     // you can put some default logic here       
}