我知道循环引用(类a包含类b,类b包含类a)。但由于我编程不够,我很难找到使用它们的理由。我想知道人们是否可以给我一些很好的例子,并可能解释使用它们的充分理由。
例如,现在我正在查看2D源代码教程,并且用户创建了一个相互引用的Creature和CreatureAi类。是什么原因?我还不知道,这就是为什么我在寻找示例并仍然在阅读。
答案 0 :(得分:11)
您有一个班级公司,其中包含为其工作的个人列表。集合中的每个Individual类实例都包含对其工作的公司的引用。
通过这种方式,您可以轻松找出哪些人适合哪些公司。请注意,它可能不一定是最好的设计,尤其是如果使用ORM或文档数据库将类持久化到数据库中。
答案 1 :(得分:10)
循环引用最明显的例子是自引用:链接列表,树和许多其他递归结构需要它。
循环引用通常隐含在相关类的层次结构中,例如具有任意嵌套的UI元素或表达式树。
最后,循环引用的一个常见情况是双向父子关系:父对象(例如UI面板)保存对其子对象的引用,并且每个子对象(例如按钮,表等)都包含对父母的引用。父母需要向孩子发送动机,告诉他们孩子的启用,禁用,可见或不可见;孩子可以通知父母需要调整大小,改变视觉状态等。
这最后一个例子可能类似于你的Creature-CreatureAI对:它们是分开的,因为它们的关注点不同,但是它们彼此有引用,因为它们需要在不同的任务上合作。
答案 2 :(得分:2)
自我参考或参考周期有多种原因
它们可能是域模型中固有的;例如人们有孩子也是人,文件夹包含其他东西,包括其他文件夹。自我引用或循环是实现这些事情的自然方式。
它们可能是通用或特定于应用程序的数据结构所固有的;例如。链表由包含对列表中“下一个”和“上一个”节点的引用的节点组成,这需要Node类引用自身。
循环引用背后的原因可能是应用程序设计的基本部分。
或者,它可以简单地实现方便,或者是之前重构或代码库演变的历史人工制品。
基本上,您需要(在整体上)查看应用程序代码库,以找出存在这些循环依赖的原因......以及它们是否真的有必要。
答案 3 :(得分:0)
通常,这不是必需的,但为与对象一起使用的代码提供了高度便利。
其他时候,确实需要它。例如,某些关系需要在代码中表示为数据结构,并且关系是自反的。