对象层次结构"Implementation" - "the easiest way"或如何避免虚拟继承?

"Implementation" of the object hierarchy - "the easiest way" or how to avoiding virtual inheritance?

本文关键字:何避免 虚拟 继承 easiest Implementation 层次结构 the 对象 way      更新时间:2023-10-16

我有一些相当复杂的虚拟对象层次结构,它们将3D引擎中的所有元素表示为抽象类(接口)。

例如,我有Renderable,其父是Sizeable(使用getSize()方法)。Sizeable继承自Positionable(带getPosition())等

该结构是精细和逻辑的(例如,3D模型是Renderable,用于皮肤的骨骼是Sizeable,而相机只有Positionable)。

还有一个"uber-class", Engine3D

我的目标是:

我必须为"图形事物"(模块)编写"实现"。这将是DirectX"实现"。目的:使用我的"实现"的程序员可以切换到其他快速和简单(他使用的实现对他来说几乎是透明的)。

我想保持这种方式:

//choosing module "implementation" ("implementation" mentioned here only)
Engine3D * engine = new MyEngine3D();
Renderable * model = engine->createModel(...);
//line above will return MyRenderable class in fact,
//but user (programmer) will treat it as Renderable

为什么我要创建"自己的"Renderable和所有其他版本?因为它们将共享一些"实现"特定的数据(DirectX结构的指针等)。

我的问题是:

但是这样,我将创建一个"镜像"-原始模块的对象层次结构的副本,每个类名前面都有My。此外,MyRenderable必须继承Renderable(以overwide render())和MySizeable(以获得DirectX矩阵等)。

这涉及到虚拟继承,使结构变得非常复杂。

有更简单的方法吗?

我主要说的是避免虚拟多重继承(我想,仅仅多重继承是可以的)。

一定要避免对象层次结构和呈现实现的强耦合。我的建议是将所有DirectX特定代码移动到对象层次结构之外的类中,例如IRenderer接口和DirectXRenderer实现。添加一个引用或指针到IRenderer的所有类必须绘制的东西(Renderable等)。所有的对象类必须使用你自己实现的矩阵等,以保持它们独立于实际渲染后端的数据结构。