我一直在用RhinoMocks做一些嘲弄,它需要虛擬方法變得虛擬。這很好,除了我們有一個自定義框架,其中包含我想要模擬的方法,而這些方法當前未標記爲虛擬。使方法變爲虛擬的危險是什麼?
我不能預見使這些方法成爲虛擬的任何問題,但我想知道什麼是使方法虛擬的一些潛在的危險,我應該注意什麼?
我一直在用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方法被調用自己的構造單行已經跑了。
Ayende有如何虛擬方法一個很好的處理工作:
http://ayende.com/Blog/archive/2007/01/05/HowVirtualMethodsWork.aspx
我從來沒有用過犀牛,所以我很好奇爲什麼它需要這個。任何人都在意解釋? – 2008-09-26 01:32:52