[英]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.