最佳继承层次结构,例如:Model3D - > ModelAnimated VS ModelAnimated或Model3D - > ModelAnimated

时间:2014-11-18 15:54:33

标签: c++ inheritance

我正在开发一些继承树,它代表我的渲染引擎中的3D对象。

我的3D模型可以是静态的也可以是动画的。您可以移动(平移),旋转或缩放它们,但只有动画3D模型附加了骨骼(因此它们会以骨骼移动的方式变形)。

我的第一个是创建这样的层次结构:

//#1:
Model3D <|-- ModelStatic
Model3D <|-- ModelAnimated

另一方面,您可以将其视为:我们有一个Model3D类,其中一些模型可以设置动画:

//#2:
Model3D (=ModelStatic) <|-- ModelAnimated

3D模型只是一个例子。同样的问题会在任何层次结构中反复出现。

问题是:何时应该使用#1方法?何时应该使用#2?这两个概念有哪些好处和缺点?

到目前为止,我想出了那些:

#1

的优点:

  • 静态和动画模型可以从常见类型(移动,旋转,缩放)继承一些方法。

反政府:

  • 静态模型和动画模型将继承的大多数方法都必须分别重写(因为缓存,优化等等,它们以不同的方式存储数据/成员)。 / LI>

#2

的优点:

  • 我们总是知道如果我们得到Model3D,我们至少可以像静态模型一样对待它(在#1中,当我们得到Model3D时,它可以是动画的,我们无法使用假设它是静态模型,需要进行一些演员/检查。

反政府:

  • 长命名约定(例如,对于动画和静态精灵,它将是SpriteStatic而不仅仅是&#34; Sprite&#34;依此类推)。

哪种方法看起来更自然?很难说,我不知道 - 他们都描述了这个问题。

换句话说

换句话说:动画模型附魔静态或者更确切地说动画和静态是两种类型的模型

1 个答案:

答案 0 :(得分:0)

根据您的具体细节,这有点主观。但是作为一般规则,只需避免从具体的基类继承,这样就给我们留下了选项1.例如,请参阅why derive from a concrete class is a poor design了解一些细节。

从那个问题Or, as Scott Meyers puts it in Item 33 of More Effective C++,[8] "Make non-leaf classes abstract."

简短版本是具有具体的基类使得更容易意外地切掉子对象,错误地使用数组。抽象基类只提供一个接口。请记住,您应该继承替换,而不是重用代码!请记住,仅仅因为基类是抽象的并不意味着它不能拥有自己的公共状态和相应的非虚方法来操作该状态。