25
考慮下面的代碼:調用多態場式的事件
public class TableMain {
public virtual event Action UpdateFilter;
....
}
public class TableSub : TableMain {
public override event Action UpdateFilter;
public void UpdateQuery() {
.....
if (UpdateFilter!=null) {
UpdateFilter(); // Invocation of polymorphic field-like event???
}
}
}
在這段代碼ReSharper顯示警報「多態場式的事件調用」。
我的問題是: 這實際上是什麼意思?這是一個糟糕的編程習慣的警報? 另外,多態地調用一個事件是不好的做法? (知道一個事件只能從宣佈它的類中提出)。
這聽起來像是一個很大的潛在錯誤來源,因爲它很可能不是您在編寫此類代碼時所期望的。以前從來沒有必要去思考這個特定的方面。你知道爲什麼虛擬事件在句法上被允許嗎? – 2010-10-15 06:34:53
@John。關於---「請注意,您的事件簽名與事件的常規約定不符 - 任何不使用EventHandler的原因?」我只是利用現有的「Action」委託,因爲在這種情況下,我不需要任何參數(object,eventargs)在這個事件的訂閱者中。這(再次)是一種糟糕的編程習慣嗎?爲這種情況創建一個單獨的(空)代表是否更好? – 2010-10-15 06:41:37
@Thomas:有些方法可以*合理地使用它們 - 例如,您可以記錄每個訂閱,然後將其傳遞給基本實現。此外,您還需要能夠有效地抽象事件以將其置於接口中。 – 2010-10-15 06:57:10