簡體   English   中英

事件處理 inheritance (C++)

[英]event handling inheritance (C++)

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

我想創建一個具有虛擬功能(稱為EventManager )的通用超級 class ,以便在整個應用程序中提供一致性。

我計划在EventManager中有以下虛擬功能:

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

我使用EventArgs作為參數,因為其他參數( XmlNodeChangeEventArgs, DataRowChangeEventArgs, DataColumnChangeEventArgs )都是從它派生的。 但是通過在虛擬函數中使用它,我將丟失派生事件參數獨有的信息。

我的問題,我應該如何設計/處理這個超級 class 和虛擬功能,以便擁有一個管理事件的通用 class ,但仍然可以正確地 map (以及所需的所有派生信息)?

我已盡力解釋我的情況,但請隨時提出問題以澄清問題。 我真的在尋找深思熟慮的答案,所以我願意改進我的問題!

提前感謝您的時間和耐心::)

  1. 通過reference傳遞 arguments ,通過值傳遞只會增加額外的開銷。

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

您可以使用dynamic_cast並檢查向下轉換的有效性,不會丟失任何信息。

除了通過引用而不是按值傳遞所有事件(這會將它們切片,因此您甚至無法將它們丟棄),我會考慮定義一些更抽象的方式來查看您的事件,以便將引用傳遞給基礎 class 不會妨礙您訪問派生類中定義的所有功能。

我不知道這是否可能,但是您可以使 EventArgs class 成為虛擬基礎 class 公開一個足夠通用的接口,以承載您在派生類中可能需要的所有內容。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM