在示例游戏引擎服务器中,游戏世界可以由 World 对象表示。游戏可能有多个游戏世界,一个世界中的玩家只需要接收该世界中单位的位置数据。
class World
{
public List<Unit> Units { get; set; }
}
然而,一段代码还需要能够轻松地查找一个单元所在的世界,因此单元对象本身会跟踪世界引用。
class Unit
{
public World World { get; set; }
}
这适用于查找,但是当程序员不知道正在发生的对象之间的关系时更改数据时很快就会出现问题,因此我将其更改Units
为World
只读并在Unit
.
public virtual World World
{
get { return _world; }
set
{
// Unit must always be in a world
Contract.Requires<ArgumentNullException>(value != null);
// If already this, don't do anything
if (value == _world) return;
var oldWorld = _world;
_world = value;
if(oldWorld != null) oldWorld.UpdateUnitEntry(this);
_world.UpdateUnitEntry(this);
}
}
这行得通,但感觉有更好的方法来做到这一点。特别是当我添加更多需要以相同方式链接的东西时(aWorld
也有Structure
s 和Player
s),会出现很多重复的功能。有没有更好的方法来实现这种一对多的关系,而无需手动更新双方?