2011-06-01 129 views
0

我正在重新設計如何處理現有代碼(使用C++)中的事件(與數據相關)。要處理的事件是DataTable相關事件和XmlNode相關事件。事件處理繼承(C++)

我想創建一個虛函數,以便在應用程序提供一致性(稱之爲EventManager)一般的超類。

我打算有在EventManager下列虛擬功能:

DataChanged(EventArgs arg) 
DataChanging(EventArgs arg) 
DataInserted(EventArgs arg) 
DataInserting(EventArgs arg) 
DataRemoved(EventArgs arg) 
DataRemoving(EventArgs arg) 

我已經使用EventArgs作爲參數,因爲其他人(XmlNodeChangeEventArgs, DataRowChangeEventArgs, DataColumnChangeEventArgs)從它派生的。但是通過在虛擬函數中使用它,我將失去獨有於衍生事件參數的信息。

我的問題,我應該怎麼來設計/處理這個超級類和虛函數,以便有一個管理事件的一般類,但仍能正常映射(與所需的所有信息)到派生類?

我盡我所能去解釋我的情況,但請隨時提問,以澄清問題。我真的很想找出答案,所以我願意改進我的問題!

預先感謝您的時間和耐心! :)

+0

根據需要使用引用或const引用,而不是進行復制。 – DumbCoder 2011-06-01 16:21:43

回答

1
  1. 傳遞參數reference,通過值傳遞只是增加了額外的開銷。

  2. 但是通過在虛擬函數中使用它,我將失去獨有於派生事件參數的信息。

您可以使用dynamic_cast並檢查垂頭喪氣的有效性,將沒有信息丟失。

1

除了由值通過引用傳遞所有的事件,而不是(這將切片他們,讓你甚至無法投下來),我想定義的看着你的活動多一些抽象的方式,使傳遞對基類的引用不會妨礙您訪問派生類中定義的所有功能。

我不知道這是否是可能的,但你可能讓你的EventArgs類虛基類暴露通用的,足以承載所有你可能需要在派生類的接口。

如果指定的操作和行爲,你設想爲你的活動更多的信息,我可以嘗試,並提供更詳細的建議。

+0

好吧,我正在做的變化(去「一般」)的最大原因是應用程序中的撤銷/重做。目前,undo/redo只處理XmlNode事件,但它需要處理所有類型的數據事件(因此也是繼承方法)。顯然,撤消/重做需要知道數據的原始值和當前值。這樣回答你的問題嗎? – developer 2011-06-01 16:51:52