Каковы опасности превращения метода в виртуальный?

StackOverflow https://stackoverflow.com/questions/137260

Вопрос

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

Я не вижу никаких проблем с созданием этих методов виртуальными, но мне было интересно, каковы некоторые потенциальные опасности создания виртуальных методов, на которые мне следует обратить внимание?

Это было полезно?

Решение

На самом деле это может быть очень проблематично, если метод не предназначен для переопределения и кто-то переопределяет его.В частности, никогда не вызывайте виртуальный метод из конструктора.Рассмотреть:

class Base {
    public Base() {
       InitializeComponent();
    }
    protected virtual void InitializeComponent() {
        ...
    }
}

class Derived : Base {
    private Button button1;
    public Derived() : base() {
        button1 = new Button();
    }
    protected override void InitializeComponent() {
        button1.Text = "I'm gonna throw a null reference exception"
    }
}

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

Другие советы

  • Если у вас есть пользователи, которые переопределяют ваши виртуальные методы, вы не сможете запечатать их снова, не нарушив код.
  • Любые виртуальные методы, которые вы вызываете из конструктора, могут быть отнесены к производным реализациям, и если они не вызывают базовый метод, а конструктор зависит от него, объект может находиться в недопустимом состоянии

У Айенде есть хорошее представление о том, как работают виртуальные методы:

http://ayende.com/Blog/archive/2007/01/05/HowVirtualMethodsWork.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top