2017-05-04 28 views
5

実世界の例は非常に単純です。家があり、家には壁などがあります。子クラスの親要素

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

クラスでこのオブジェクトを持っていることは非常に楽しいです。 1つは多くの場所で親要素にアクセスする(430)。しかし、私はそれがそこに属していないと思うし、あなたがそれを設定したり変更したりしないので、エラーにつながることもあります。

多くの場合、メソッドのハンドオーバを除いて、他の方法がありますか?

答えて

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

あなたの情報は冗長です。 RoomList<Wall>には、あるプロパティが別の部屋を参照する壁が含まれている可能性があります。これはバグです。したがって、Wallからそれを削除するか、WallのすべてがWallsのセッターでチェックされるようにしてください。壁のRoom!= thisの場合、例外がスローされたり変更されたりする可能性があります。部屋は通常4つの壁を持っているので、それは大したことではありません

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

は、だから私は Roomクラスを少し変更したいです。

関連する問題