事件处理继承(C ++)

时间:2011-06-01 16:17:44

标签: c++ events inheritance

我正在重新设计如何处理现有代码的事件(与数据相关)(在C ++中)。要处理的事件包括DataTable相关事件和XmlNode相关事件。

我想创建一个带有虚函数的通用超类(称之为EventManager),以便在整个应用程序中提供一致性。

我计划在EventManager中使用以下虚拟函数:

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

我使用EventArgs作为参数,因为其他(XmlNodeChangeEventArgs, DataRowChangeEventArgs, DataColumnChangeEventArgs)是从它派生的。但是通过在虚函数中使用它,我将丢失派生事件args独有的信息。

我的问题是,我应该如何设计/处理这个超类和虚函数,以便拥有一个管理事件的通用类,但仍然可以正确地映射(包含所需的所有信息)到派生类?

我尽力解释我的情况,但请随时提出问题以澄清问题。我真的在寻找经过深思熟虑的答案,所以我愿意改进我的问题!

提前感谢您的时间和耐心! :)

2 个答案:

答案 0 :(得分:1)

  1. 通过reference传递参数,传递值只会增加额外的开销。

  2. 但是通过在虚拟函数中使用它,我将丢失派生事件args特有的信息。

  3. 您可以使用dynamic_cast并检查向下转发的有效性,不会丢失任何信息。

答案 1 :(得分:1)

除了通过引用传递所有事件,而不是通过值(将它们分割,以便你甚至无法将它们删除),我会想到定义一些更抽象的方式来查看你的事件以便传递对基类的引用不会妨碍您访问派生类中定义的所有功能。

我不知道是否可能,但你可以使你的EventArgs类成为一个虚拟基类,公开一个足够通用的接口来托管你在派生类中可能需要的所有东西。

如果您指定了有关您为活动设想的操作和行为的更多信息,我可以尝试提供更详细的建议。