2017-05-04 5 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; } 
} 

클래스에서이 개체가 매우 쾌적합니다. 하나는 많은 장소에서 모 원소에 접근 할 수있다 (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

네가 맞아요, 정보는 중복됩니다. Room에있는 List<Wall>은 언제나 버그 일 수있는 Room 속성이 다른 벽을 참조하는 벽을 포함 할 수 있습니다. 따라서 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 클래스를 약간 수정하는 것입니다.

관련 문제