簡體   English   中英

子類中的父元素

[英]Parent element in child class

現實世界的例子非常簡單。 有一所房子,房子有牆壁等。

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)。 但我認為它不屬於那里,有時會導致錯誤,因為你沒有設置或改變它。

除了在許多情況下的方法切換之外,還有其他方法嗎?

解決這個問題的方法並不多,但通常我會選擇更改所使用的列表類型,並使用適當的事件來注冊和取消注冊父項。

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;
                }
        }
    }
}

你是對的,信息是多余的。 Room中的List<Wall>總是可能包含Room屬性指向不同房間的牆,這將是一個錯誤。 因此,要么將其從Wall移除,要么確保每個Wall都將在Walls的設置中進行檢查。 如果牆的Room!= this可以拋出異常或更改它。

所以我稍微修改了Room類:

public class Room
{
    private List<Wall> walls;

    public Room(): this(new List<Wall>())
    {
    }

    public Room(List<Wall> walls)
    {
        this.Walls = walls;
    }

    public List<Wall> Walls
    {
        get
        {
            return this.walls;
        }

        set
        {
            foreach (Wall wall in value)
            {
                if (wall?.Room != this)
                {
                    throw new ArgumentException("Every wall's room must be this Room instance", nameof(Walls));
                }
            }
            this.walls = value;
        }
    }
}

由於房間通常有4面牆,所以應該不是什么大問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM