2008-09-26 89 views
6

我一直在用RhinoMocks做一些嘲弄,它需要虛擬方法變得虛擬。這很好,除了我們有一個自定義框架,其中包含我想要模擬的方法,而這些方法當前未標記爲虛擬。使方法變爲虛擬的危險是什麼?

我不能預見使這些方法成爲虛擬的任何問題,但我想知道什麼是使方法虛擬的一些潛在的危險,我應該注意什麼?

+1

我從來沒有用過犀牛,所以我很好奇爲什麼它需要這個。任何人都在意解釋? – 2008-09-26 01:32:52

回答

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
  • 如果您有用戶覆蓋您的虛擬方法,您不能再次密封它們而不會破壞代碼。你叫
  • 任何虛擬方法從構造可能會掉下來派生實現,如果他們不調用基方法和構造函數依賴於它,對象可能是處於無效狀態