2008-09-26 4 views
6

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

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

+1

Я никогда не пользовался Rhino, поэтому мне любопытно, зачем это требуется. Кто-нибудь должен объяснить? –

+0

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

ответ

8

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

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 вызывается до того, как одна строка его собственного конструктора побежал.

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