Каковы опасности создания метода виртуальным? - PullRequest
6 голосов
/ 26 сентября 2008

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

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

Ответы [ 3 ]

8 голосов
/ 26 сентября 2008

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

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"
    }
}

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...