OOP练习让对象互相引用是不是很糟糕?

lal*_*ala 25 oop

原谅我的noobness.我正在制作一个游戏,其中几个角色彼此之间有关系,他们需要能够相互交互并存储一些关于彼此感觉的关系数据.

我为每个角色都有一个对象.为了执行这些交互,每个角色对象是否都有一个包含所有其他角色对象的数组?有一个更好的方法吗?

编辑回答问题: 我的语言是C#.

我在想的是,setup类会创建一个包含所有字符的数组,然后将该数组作为参数传递给每个字符的构造函数.

至于关系的类型,有五个字符,但我想在以后添加更多的情况下使其可扩展.角色互相交谈.他们说的是他们的情绪和他们对这个角色的感受.另外,另一个角色对他们说的话会影响他们的情绪以及他们对角色的感受.他们可以进行一对一的对话或分组交谈,因此角色A可以同时对角色B,C,D,E和F说些什么.

顺便说一句,我从这个线程中学到了很多东西.谢谢大家!谢谢!

dth*_*rpe 19

这不是实践的对象保持相互之间的引用糟糕 - 这并不是什么稀罕事在树图中的节点为参考保持自己的子节点,并为子节点,以保持它们的父节点的引用.

可能成为问题的一件事是你描述的每个角色保持对所有其他角色的引用.这是一个NxN矩阵,随着字符数量的增加会爆炸你的内存使用.

在每个字符对象中存储所有字符对象列表的替代方法可能是设置关键字列表或字典,其中键是(字符1,字符2),内容是关系.此列表可以是全局的,并存储所有字符之间的所有关系.这里的优点是它与实际关系的数量呈线性增长,而不是与系统中的字符数呈指数关系.


Uri*_*Uri 9

避免对象之间不必要的引用通常是好的,但确定什么是不必要的是非常主观的并且取决于问题.

如果每个字符都有唯一的标识符(例如,唯一的名称),则只能为每个字符存储字符标识符的集合和关于该字符的"感觉".使用其他一些CharacterManager类型,您可以根据标识符查找字符.

另一种选择(如果意见只是游戏的一个小方面可能更可取)是拥有一个单独的"RelationshipManager"类,它可以回答诸如"字符Y对字符Y的感觉如何"这样的查询?这可能是一个更好的设计,因为该责任与您的核心角色分开管理.该经理可以直接引用字符,也可以使用标识符.


Dón*_*yle 7

在面向对象设计中,像这样的问题的常见方法是中介模式

您描述的方法存在的问题是如何更新关系?例如,如果从游戏中删除角色A,如何更新其他角色以从其关系中删除角色A?

我建议有另一个管理关系的对象.然后,该对象可以负责更新关系.使用相同的示例,当删除字符A时,关系管理器简单地删除涉及该字符的所有关系.


Har*_*83- 0

不一定,但这取决于您如何定义和引用关系。例如,如果您想将一个角色对象替换为另一个角色对象,会发生什么情况?您是否必须更新引用该对象的所有对象?