最佳继承层次结构,例如:Model3D -> ModelAnimation VS ModelAnimation or Model3D -> ModelAnimation
Best inheritance hierarchy, on example of: Model3D -> ModelAnimated VS ModelAnimated or Model3D -> ModelAnimated
我正在开发一些继承树,用于表示渲染引擎中的 3D 对象。
我的 3D 模型可以是静态的,也可以是动画的。您可以移动(平移)、旋转或缩放它们,但只有动画 3D 模型会附着骨骼(因此它们会以骨骼移动的方式变形)。
我的第一个问题是创建这样的层次结构:
//#1:
Model3D <|-- ModelStatic
Model3D <|-- ModelAnimated
另一方面,您可以将其视为:我们有一个Model3D
类,其中一些模型可以动画化:
//#2:
Model3D (=ModelStatic) <|-- ModelAnimated
3D模型仅供参考。同样的问题在任何层次结构中都会一遍又一遍地重新出现。
问题是:我什么时候应该使用 #1 方法,什么时候应该使用 #2?这两个概念有什么好处,有什么缺点?
到目前为止,我想出了这些:
#1
:
优点:
- 静态和动画模型可以从常见类型(移动、旋转、缩放)继承一些方法。
反政府武装:
- 静态和动画模型将继承的大多数方法无论如何都必须重写,因为它们都是分开的(由于缓存、优化等,它们以不同的方式存储数据/成员)。
#2
:
优点:
- 我们总是知道,如果我们得到一个
Model3D
,我们至少可以像静态模型一样对待它(在#1
中,当我们得到Model3D
它可以是动画的,我们不能使用它假设它是一个静态模型,需要一些铸造/检查)。
反政府武装:
- 长命名约定(例如,对于动画和静态精灵,它将是 SpriteStatic 而不仅仅是"精灵"等)。
哪种方法看起来更自然?几乎不说话,我不知道——他们都描述了这个问题。
换句话说,
换句话说:动画模型附魔静态一个或更确切地说,动画和静态是两种类型的模型?
根据您的具体情况,这有点主观。但是,作为一般规则,只需避免从具体的基类继承,这给我们留下了选项 1。例如,请参阅为什么从具体类派生对于一些细节来说是一个糟糕的设计。
从这个问题Or, as Scott Meyers puts it in Item 33 of More Effective C++,[8] "Make non-leaf classes abstract."
简短的版本是,具有具体的基类可以更容易意外地切掉子对象,错误地使用数组。抽象基类只提供一个接口。请记住,您应该继承以替换,而不是重用代码!请记住,仅仅因为基类是抽象的并不意味着它不能拥有自己的公共状态,并使用相应的非虚拟方法来对该状态进行操作。
相关文章:
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C 字符串比较“祝您好运”&gt;“再见”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- ``这个''不能用this-&gt;指针变量
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 使用shared_ptr<字符串>转换为一个无序集合<字符串>
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到