子类中的父元素

Tom*_*orf 5 c# design-patterns

现实世界的例子非常简单.有一所房子,房子有墙壁等.

class Room {
    public List<Wall> Walls{get; set;}
}

class Wall {
    public List<WallObject> WallObjects{get; set;}
}
Run Code Online (Sandbox Code Playgroud)

几年前,开发人员已经将房产空间添加到了隔离墙:

class Wall {
public List<WallObject> WallObjects{get; set;}
public Room Room{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在课堂上有这个对象是非常愉快的.一个人可以在许多地方访问父元素(430).但我认为它不属于那里,有时会导致错误,因为你没有设置或改变它.

除了在许多情况下的方法切换之外,还有其他方法吗?

Pat*_*man 1

没有很多方法可以轻松解决此问题,但通常我会选择更改所使用的列表类型并使用适当的事件来注册和取消注册父级。

public class Room
{
    public ObservableCollection<Wall> Walls { get; } = new ObservableCollection<Wall>();

    public Room()
    {
        Walls.CollectionChanged += Walls_CollectionChanged;
    }

    private void Walls_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        switch (e.Action)
        {
            case NotifyCollectionChangedAction.Add:
                {
                    foreach (Wall w in e.NewItems)
                    {
                        w.Room = this;
                    }

                    break;
                }
            case NotifyCollectionChangedAction.Remove:
                {
                    foreach (Wall w in e.OldItems)
                    {
                        w.Room = null;
                    }

                    break;
                }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)