加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用多重继承来实现实体 – 组件编程

发布时间:2020-12-16 07:07:46 所属栏目:百科 来源:网络整理
导读:我已经阅读了一些关于实体 – 组件编程风格的文章.提出的常见问题之一是如何表达组件之间的依赖关系,以及与同一实体相关的组件如何通信. 在我看来,这个问题的一个简单的解决方案是使每个依赖项成为其依赖的虚拟基类. 这样,当组件包含在实体中时(通过虚拟继承
我已经阅读了一些关于实体 – 组件编程风格的文章.提出的常见问题之一是如何表达组件之间的依赖关系,以及与同一实体相关的组件如何通信.

在我看来,这个问题的一个简单的解决方案是使每个依赖项成为其依赖的虚拟基类.

这样,当组件包含在实体中时(通过虚拟继承),所有依赖组件只包含一次.此外,组件所依赖的所有功能都将在其成员函数中提供.

class C_RigidBody : public virtual C_Transform {
    public void tick(float dt);
};

class C_Explodes : public virtual C_Transform {
    public void explode();
};

class E_Grenade : public virtual C_RigidBody,public virtual C_Explodes {
    //no members
};

有没有人这样做?

(我意识到由于“钻石问题”,多重继承通常不受欢迎,但这个问题无论如何都是组件必须处理的问题.(想象一下,有多少组件将取决于实体在游戏世界中的位置))

解决方法

我最近也和你提出了同样的想法.

从理论上讲,我认为如果适当应用,这种方法是依赖逆的完美解决方案.否则你会搞砸了.

回顾DIP所说的内容:

  • High-level modules should not depend on low-level modules. Both should
    depend on abstractions.

  • Abstractions should not depend on details. Details should depend on abstractions.

请参阅以下代码示例

struct IClockService
{
    virtual unsigned timestamp() = 0;
};

struct ITimingService
{
    virtual unsigned timing(std::function<void()> f) = 0;
};

struct ClockService : public virtual IClockService // public virtual means implement
{
    virtual unsigned timestamp() { return std::time(nullptr); }
};

struct TimingService : public virtual ITimingService,private virtual IClockService // private virtual means dependency
{
    virtual unsigned timing(std::function<void()> f)
    {
        auto begin = timestamp();
        f();
        return timestamp() - begin;
    }
};

class Application : public ClockService,public TimingService
{
};
Application a; 
unsigned runingTime = a.timing(anyFunction);

在上面的例子中. ClockService和TiminigService是两个模块,它们不需要彼此了解,只需要接口IClockService和ITimingService.应用程序将两个模块组合在一起.

结论:

> Map依赖于私有虚拟继承,否则会破坏Liskov-Subtitution Principle
> Map实现为公共虚拟继承.
>模块实现仅取决于抽象,这是DIP所需要的.
>如果发生任何编译,则通过正常继承将所有模块合并在一起,这意味着接口存在未满足的依赖关系或多实现.

我只在我的玩具项目中应用这样的习语.承担风险自负.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读