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



我正在开发一些继承树,用于表示渲染引擎中的 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."

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

最新更新