对象层次结构"Implementation" - "the easiest way"或如何避免虚拟继承?
"Implementation" of the object hierarchy - "the easiest way" or how to avoiding virtual inheritance?
我有一些相当复杂的虚拟对象层次结构,它们将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
等)。所有的对象类必须使用你自己实现的矩阵等,以保持它们独立于实际渲染后端的数据结构。
- C++避免重复声明的语法是什么
- 在没有太多条件句的情况下,我如何避免被零除
- 虚拟决赛作为安全
- 如何重构类层次结构以避免菱形问题
- 避免C++虚拟继承
- 如何避免重复的const和非const虚拟函数?是否可以
- 在这种情况下是否可以避免使用虚拟方法调用?
- 避免使用虚拟模板函数
- 避免虚拟调用循环的模式
- 如何避免虚拟关键字
- 将临时对象保留在寄存器上以避免虚拟机中的额外存储/加载
- 如何避免在具有其他虚拟基类时对基类函数的不明确调用
- 有没有办法避免在特定自定义类继承结构中使用虚拟方法
- 当我知道类型时,如何避免虚拟呼叫
- 重载虚拟方法与非虚拟方法有何不同
- 在使用虚拟继承时,我可以避免重复的基类初始化吗
- 避免无休止的虚拟查找
- 对象层次结构"Implementation" - "the easiest way"或如何避免虚拟继承?
- 避免构造函数中的虚拟方法
- C++:通过调用纯虚拟函数来避免重复