gpt4 book ai didi

实体和管理器抽象的 C++ 设计

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:03 25 4
gpt4 key购买 nike

我正在编写一些代码来处理一组事件。这些事件可以根据它们的具体类型以不同的方式持久化。我目前有抽象事件的 iEvent 接口(interface),用于它们可以持久化的每种方式的 iBackend 接口(interface),以及用于每个后端的一组小接口(interface)(iFileEvent、iDBEvent 等),用于定义从事件本身。每个具体事件类都实现 iEvent 及其支持的任何功能接口(interface)组合。

反序列化时一切正常,因为这是由后端实现(文件、数据库等)执行的,所以他们知道从现有内容创建什么具体事件类型,因此可以使用具体事件类的公共(public)创建它们的方法。然而,我现在正处于需要连载新事件的地步,并且有点不知所措。

问题是我没有为每个后端提供具体类型,因为由于 iBackend 接口(interface),它们只得到一个 iEvent。

我可以加入一个 dynamic_cast,或者我可以只使用一个 rtti 比较(或其更便宜的版本)和一个 static_cast,但我不确定是否有更好的能力查询方法,我也不知道了解使用这些建议中的任何一个来解决此问题的简洁方法。

我希望在具体事件类型和用于在每个后端中持久化它们的数据结构之间进行转换的具体情况可以通过后端中每种事件类型的一组方法来实现,但我不喜欢这样所有...除了一组用于类和后端的每个组合的转换装饰器之外,还闻起来像类爆炸的令人讨厌的情况。

当我只需要事件类来声明它们支持每个后端的接口(interface)时,添加类似乎毫无意义......这让我认为转换选项是唯一的前进方向。

总而言之,我正在寻求有关更好解决方案的建议。

最佳答案

这里有一些解决方案:

  1. 保持 {file, db } * { Event1, Event2 } 的爆炸式增长
  2. 但不是为每个组合创建单独的类,而是尝试构建适用于多个组合的类。
  3. 然后您的代码仅列出所有组合,但为每个组合创建以下类型的结构:

    结构 Comb1 { 文件 f;事件1 e;实现1 i1; };

    结构 Comb2 { Db d;事件1 e2; Impl2 i3;};

    struct Comb3 { 文件 f;事件2 e;实现1 i1; };

    结构 Comb4 { Db d;事件2 e;实现3 i1; };

这些只是选择正确的实现来使用。

然后为所有类构建基类:

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

然后创建一个二维通用数组,由 {file, db} 和 { Event1, Event2} 索引。此结构允许您重用现有的实现。将 Comb1、Comb2、Comb3、Comb4 的实例添加到二维数组。

关于实体和管理器抽象的 C++ 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6891293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com