我听说作文比继承好。因此,当我设计简单的游戏引擎时,我倾向于这样做:
http://yuml.me/1252399d
而不是:
http://yuml.me/51cacb4f
这是一个好办法,还是我应该重新考虑?
编辑:澄清表示法。箭头表示继承,带有菱形的箭头表示组合,<<>>表示接口。更多关于符号的信息可以在yUML网页上找到。
发布于 2010-10-27 12:43:20
好的,这里有几件事要讲。
首先:为什么你需要表达PointLight和Spotlight之间的共性?是吗
Light使用,而不关心它们得到了哪些品种?,因为客户需要统一对待灯光,
这是接口继承,也称为子类型。作文不适用于这里,因为没有什么可写的。你可以通过两种方式意识到这一点:你所选择的主要取决于你的语言。
ILight)来实现的,该接口公开了光明的所有共同特征。客户端将只依赖于接口,而不是它的实现。PointLight和SpotLight将分别实现接口。PointLight和SpotLight。,因为您希望共享实现。
实现这一目标通常有两种方法:
Light并在其中实现公共行为。声明PointLight和SpotLight是从Light继承的,根据需要重写/添加行为。PointLight和SpotLight。实现实现公共行为的第三个类(您可能仍然称之为Light)。PointLight和SpotLight都将包含一个‘Light’的实例,并将共享行为委托给它。对于您的具体示例,在实现继承和组合之间的选择相对较少。当继承层次越深时,前者就会出现问题。在支持多重实现继承(例如脆弱的基类问题)的语言中,它也容易出错。另一方面,实现继承意味着更少的键入:语言自动地将共享行为委托给共享行为,而对于组合,则需要编写委托方法。
摘要
还请注意,上述内容并不是相互排斥的:例如,您可以:
ILight,SpotLight和PointLight都实现了从根本上说,你需要弄清楚你想要达到的目标。
hth。
发布于 2010-10-27 11:40:26
我认为你不应该基于某种谣言做出决定。有时组合确实很好,但它需要更多的代码编写和更难支持(如果您更改了BasicLight接口,则应该手动更改所有依赖类)。继承解决了这个问题,以及其他一些问题。有一些情况下,组合是可取的,但它们大多出现在复杂的项目。
https://stackoverflow.com/questions/4032359
复制相似问题