【发布时间】:2018-02-08 21:02:53
【问题描述】:
我一直在阅读有关继承与组合的文章。我知道这个网站上已经有关于这个主题的文章,但是我对这个具体的例子有疑问,我希望不会被视为重复。
到目前为止我收集的一些指导方针:
- 更喜欢组合而不是继承。
- 因此,有关系几乎总是意味着组合。
- Is-a 关系可能意味着继承是最好的,但并非总是如此。
现在举个例子
我一直在开发一个简单的游戏引擎来练习 C++。为此,我做了一些课程:
- 包含可渲染图像的 Image 类。
- Transform 类都是关于定位的。
- Sprite 类包含一个可以在特定位置渲染的图像。
当然还有更多,但让我们保持简单的例子。
所以 - Sprite HAS 图像和 HAS 位置(变换)。遵循这意味着两者的组合的指导方针。但我认为让 Sprite 从 Transform 继承要容易得多。
因为我要做什么 sprite->setPosition() 和 sprite->setScale()。
如果一个Sprite继承自Transform,我什么都不用做,sprite->setPosition()会自动为sprite对象调用Transform::setPosition()。 p>
-
如果 Sprite 有 一个变换,我将不得不将所有这些类型的方法重定向到变换! (这就是我迄今为止一直在做的事情,它似乎工作正常) 我不想为每个定位方法都写这样的东西:(已经有不少了)
Sprite::setPosition(Vector2 position) { mTransform.setPosition(Vector2 position); }
但是这似乎违背了惯例。 大家觉得呢?
【问题讨论】:
-
你不能做一个成员函数来返回对转换的引用吗?这样您就不需要手动转接呼叫了。
-
或者使用接口(纯虚类)来暴露Is-a,并用组合来实现。您将接口上的调用转发到实现成员对象。想要改变行为使用不同的组合对象。
标签: oop inheritance composition software-design