2011-07-31 131 views
2

我正在研究一些代码来处理一组事件。根据具体的类型,这些事件可以以不同的方式持续存在。我目前有iEvent接口抽象事件,它们可以被持久化的每种方式的iBackend接口,以及每个后端的一组小接口(iFileEvent,iDBEvent等),该接口定义了转换方法到从事件本身。每个具体事件类都实现iEvent以及它支持的任何能力接口组合。C++设计实体和经理抽象

当解序列化由后端实现(文件,数据库等)执行时,这一切都可以正常工作,因此他们知道从现有内容创建的具体事件类型,从而可以使用具体事件类公共方法来创建它们。然而,我现在正处于需要对新事件进行系列化并且有点困惑的地步。

的问题是,我没有提供具体的类型,每个后端,因为它们只获得给予iEvent由于iBackend接口。

我可以抛出一个dynamic_cast,或者我可以只使用一个rtti比较(或一个更便宜的版本)和一个static_cast,但我不确定是否有更好的方法来进行能力查询,不要以任何这些建议来解决这个问题。

我希望在具体事件类型和用于在每个后端保持它们的数据结构之间进行转换的具体情况可以通过后端中用于每种类型事件的一组方法来实现,但我不喜欢这样根本不是......而是针对类和后端气味的每种组合的一组转换装饰器,就像类爆炸的恶劣情况一样。

似乎毫无意义的添加类时,所有我需要的是事件类说明他们支持为每个后端......这使我觉得铸造选项是唯一的出路接口。

因此,在总结,我正在寻找咨询到这个更好的解决方案。

回答

0

下面是一些解决方案:

  1. 保持{文件,DB} * {事件1,事件2}爆炸
  2. 但不是对每个组合创建单独的类,尝试建立它适用于更多的类比一个组合。
  3. 那么你的代码只是列出了所有组合,但创建下列类型的每个组合结构:

    结构COMB1 {文件f; Event1 e; Impl1 i1; };

    结构COMB2 {Db的d; Event1 e2; Impl2 i3;};

    结构COMB3 {文件F; Event2 e; Impl1 i1; };

    结构COMB4 {Db的d; Event2 e; Impl3 i1; };

这些只是选择正确的实施投入使用。

然后建立基类的所有类:

struct Generic { FileDbBase *ptr; EventBase *base; ImplBase *impl; }; 

然后创建的通用的2D阵列,由两个索引{文件,分贝}和{事件1,事件2}。这个结构允许你重用现有的实现。将Comb1,Comb2,Comb3,Comb4的实例添加到2d数组中。