6

我知道循环引用(A 类持有 B 类,B 类持有 A 类)。但是由于我的编程不够,我很难找到使用它们的理由。我想知道人们是否可以给我一些例子并解释使用它们的充分理由。

就我而言,现在我正在查看 2D 源代码教程,用户创建了一个相互引用的 Creature 和一个 CreatureAi 类。是什么原因?我还不知道,这就是为什么我正在寻找示例并仍在阅读的原因。

4

4 回答 4

12

您有一个类 Company,其中包含为其工作的个人列表。集合中的每个 Individual 类实例都包含对他们工作的公司的引用。

通过这种方式,您可以轻松找出哪些人为哪些公司工作。请注意,它可能不一定是最好的设计,特别是如果使用 ORM 或文档数据库将类持久化到数据库中。

于 2012-06-09T01:32:42.907 回答
10

循环引用最明显的例子是自引用:链表、树和许多其他递归结构都需要它。

循环引用通常隐含在相关类的层次结构中,例如具有任意嵌套的 UI 元素或表达式树。

最后,循环引用的一个常见情况是双向父子关系:父级(例如 UI 面板)持有对其子级数组的引用,每个子级(例如按钮、表格等)持有对其的引用。父母。父母需要向其孩子发送主题信息,告诉他们它已启用、禁用、可见或不可见;孩子可能会通知父母需要调整大小、更改视觉状态等。

最后一个示例可能类似于您的 Creature-CreatureAI 对:它们是独立的,因为它们的关注点不同,但它们相互引用,因为它们需要在不同的任务上进行合作。

于 2012-06-09T01:38:50.503 回答
2

自参考或参考周期有多种原因

  • 它们可能是领域模型中固有的;例如,人们的孩子也是人,文件夹包含其他内容,包括其他文件夹。自引用或循环是实现这些东西的自然方式。

  • 它们可能是通用或特定于应用程序的数据结构所固有的;例如。链表由节点组成,这些节点包括对列表中“下一个”和“上一个”节点的引用,这需要 Node 类引用自身。

  • 循环引用背后的推理可能是应用程序设计的基本部分。

  • 或者,它可以只是一种实现便利,或者是以前重构或代码库演变的历史产物。

基本上,您需要(全面地)查看应用程序代码库以找出这些循环依赖项存在的原因......以及它们是否真的有必要。

于 2012-06-09T01:50:06.667 回答
0

通常它不是绝对必要的,但为与对象一起工作的代码提供了高度的便利。

其他时候,确实需要。例如,某些关系需要在代码中表示为数据结构,并且该关系是自反的。

于 2012-06-09T01:40:49.470 回答