子类中的父元素

时间:2017-05-04 12:23:44

标签: c# design-patterns

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

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

class Wall {
    public List<WallObject> WallObjects{get; set;}
}

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

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

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

除了许多情况下的方法移交外,是否还有其他方法。

2 个答案:

答案 0 :(得分: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;
                }
        }
    }
}

答案 1 :(得分:1)

你是对的,信息是多余的。 timeout中的retryWhen可能包含List<Wall>属性引用不同房间的墙,这可能是一个错误。因此,要么将其从Room中移除,要么确保在Room的设置器中检查每个Wall。如果墙的WallWalls,您可以抛出异常或更改它。

所以我稍微修改Room类:

!= this

由于房间通常有4面墙,所以不应该是一件大事。