繁体   English   中英

如何在C#中正确地具有自动更新的一对多双向关系

[英]How to properly have an automatically updating one-to-many bi-directional relationship in C#

在示例游戏引擎服务器中,游戏世界可以由世界对象表示。 游戏可能有多个游戏世界,一个世界中的玩家只需要接收该世界中单位的位置数据即可。

class World
{
    public List<Unit> Units { get; set; }
}

但是,一段代码也需要能够轻松查找单元所在的世界,因此单元对象本身可以跟踪世界参考。

class Unit
{
    public World World { get; set; }
}

这适用于查找,但是当程序员不知道正在进行的对象之间的关系时,在更改数据时很快会出现问题,因此我将World Units更改为只读,并在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);
    }
}

这行得通,但感觉有更好的方法来做到这一点。 尤其是当我添加了更多需要以相同方式链接的内容(一个World也具有StructurePlayer )时,引入了许多重复的功能。是否有更好的方式来实现这种一对多关系而无需手动更新双方?

在像C ++这样的语言中,它们没有如此出色的引用管理和GC,无论如何,像这样的循环引用都是一个问题(例如SharedPtr)。 例如游戏状态的序列化也存在问题。

这使我相信,可能有更好的方法来解决该问题。 例如,部队真的需要了解他们的世界吗? 也许看一下使您认为自己需要它的代码,也许您可​​以以不再需要的方式对其进行更改。

因此,也许实施一个实体管理系统,并且仅通过抽象ID或句柄引用您的游戏实体。 在不充当任何对象但没有实体的情况下,请先解析ID /句柄,然后再保留实体对另一个实体的引用。 如果您发现自己想要序列化游戏的状态,这也将大有帮助。

除此以外:

您所做的并不是严格的错误或其他任何事情。 如果它正在工作并且没有太大的痛苦,那就保持这种状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM