Объявление абстрактного метода - виртуальное? - PullRequest
10 голосов
/ 18 марта 2011

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

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

Также это правильно или нет?

Ответы [ 5 ]

9 голосов
/ 18 марта 2011

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

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

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

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

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

5 голосов
/ 18 марта 2011

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

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

public virtual void Render() {}

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

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

public abstract void Render();

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

4 голосов
/ 18 марта 2011

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

Возможно, ваше понимание поможет вам увидеть их в формате:

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

    }

    public virtual void Update()
    {

    }
}
2 голосов
/ 18 марта 2011

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

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

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

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

0 голосов
/ 18 марта 2011

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

public abstract void Render();

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

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