首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏引擎设计选择

游戏引擎设计选择
EN

Stack Overflow用户
提问于 2010-10-27 10:45:11
回答 2查看 1.2K关注 0票数 1

我听说作文比继承好。因此,当我设计简单的游戏引擎时,我倾向于这样做:

http://yuml.me/1252399d

而不是:

http://yuml.me/51cacb4f

这是一个好办法,还是我应该重新考虑?

编辑:澄清表示法。箭头表示继承,带有菱形的箭头表示组合,<<>>表示接口。更多关于符号的信息可以在yUML网页上找到。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-27 12:43:20

好的,这里有几件事要讲。

首先:为什么你需要表达PointLightSpotlight之间的共性?是吗

  1. 因为有些客户只是想将它们作为Light使用,而不关心它们得到了哪些品种?
  2. 因为它们共享一些实现,而您不想重复?

,因为客户需要统一对待灯光,

这是接口继承,也称为子类型。作文不适用于这里,因为没有什么可写的。你可以通过两种方式意识到这一点:你所选择的主要取决于你的语言。

  • 如果您使用的是Java/C#,这通常是通过定义一个接口(ILight)来实现的,该接口公开了光明的所有共同特征。客户端将只依赖于接口,而不是它的实现。PointLightSpotLight将分别实现接口。
  • 如果您没有使用带有第一类接口的语言,那么将Light声明为一个抽象基类,并从它继承PointLightSpotLight

,因为您希望共享实现

实现这一目标通常有两种方法:

  • 实现继承。定义类Light并在其中实现公共行为。声明PointLightSpotLight是从Light继承的,根据需要重写/添加行为。
  • 构图。在不继承公共超类的情况下定义类PointLightSpotLight。实现实现公共行为的第三个类(您可能仍然称之为Light)。PointLightSpotLight都将包含一个‘Light’的实例,并将共享行为委托给它。

对于您的具体示例,在实现继承和组合之间的选择相对较少。当继承层次越深时,前者就会出现问题。在支持多重实现继承(例如脆弱的基类问题)的语言中,它也容易出错。另一方面,实现继承意味着更少的键入:语言自动地将共享行为委托给共享行为,而对于组合,则需要编写委托方法。

摘要

还请注意,上述内容并不是相互排斥的:例如,您可以:

  • 声明一个接口ILightSpotLightPointLight都实现了
  • 使用实现继承或组合共享共同行为

从根本上说,你需要弄清楚你想要达到的目标。

hth。

票数 4
EN

Stack Overflow用户

发布于 2010-10-27 11:40:26

我认为你不应该基于某种谣言做出决定。有时组合确实很好,但它需要更多的代码编写和更难支持(如果您更改了BasicLight接口,则应该手动更改所有依赖类)。继承解决了这个问题,以及其他一些问题。有一些情况下,组合是可取的,但它们大多出现在复杂的项目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4032359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档