如何通过构造函数正确初始化两个类之间的父子引用

2024-03-27

我有两节课。第一类是Parent,其中有一个对象列表(Child)。每一个Child参考了他的Parent班级。问题是如何通过构造函数来实现这个引用。

public sealed class Child
{
    public Child(string id, string name, Parent parent)
    {
        Id = id;
        Name = name;
        Parent = parent;
    }

    public Parent ParentInstance { get; private set; }
    public string Id { get; private set; }
    public string Name { get; private set; }
}

public sealed class Parent
{
    public Parent(string id, string name, IEnumerable<Child> children)
    {
        Id = id;
        Name = name;
        Children = children;
    }

    public string Id { get; private set; }
    public string Name { get; private set; }
    public IEnumerable<Child> Children { get; private set; }
}

问题是我有一个代码可以解析一些 XML 代码并创建以下列表Parent对象。这是示例:

internal Parent ParseParent(XElement parentXElement)
{
    return new Parent(parentXElement.Attribute("id").Value, parentXElement.Attribute("name").Value, parentXElement.Descendants("child").Select(ParseChild));
}

当然我可以初始化Parent内的财产Parent构造函数,只需删除private from Parentsetter ,然后遍历所有子项并使用此属性。但我想将其设为只读。像这样的事情:

public Parent(string id, string name, IEnumerable<Child> children)
{
    Id = id;
    Name = name;
    Children = children.ForEach(c => c.ParentInstance = this);
}

不可改变and包括循环引用,你需要这样的东西:

public sealed class Parent
{
    private readonly IEnumerable<Child> children;
    private readonly string name; // Just for example

    public Parent(XElement element)
    {
         name = (string) element.Attribute("name");
         children = element.Elements("Child")
                           .Select(x => new Child(x, this))
                           .ToImmutableList(); // Or whatever collection you want
    }
}

public sealed class Child
{
    private readonly Parent parent;
    private readonly string name; // Just for example

    public Child(XElement element, Parent parent)
    {
        this.name = (string) element.Attribute("name");
        // Better not ask the parent for its children yet - they won't be
        // initialized!
        this.parent = parent;
    }
}

评论中的Child构造函数应该会让你大吃一惊。虽然Parent是不可变的,我们正在泄漏this在我们完成初始化之前...所以Child构造函数需要确保它doesn't尝试在构建过程中找到它的兄弟姐妹。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过构造函数正确初始化两个类之间的父子引用 的相关文章

随机推荐