2016-11-04 3 views
0

항상 정렬해야하므로 int List 필드와 속성을 가진 추상 클래스가 있습니다.추상 클래스의 하위 클래스에서 Add 및 Remove 메서드 사용 중지 List 속성

public abstract partial class FindAndReplace : Form { 

    private readonly List<int> _columnsToSearch = new List<int>(); 
    public List<int> ColumnsToSearch { get { return _columnsToSearch; } } 

    public void AddToColumnsToSearch(int intToAdd) { 
     _columnsToSearch.Add(intToAdd); 
     _columnsToSearch.Sort(); 
    } 

    protected abstract void ColumnCheckBox_CheckChanged(object sender, EventArgs e); 

    ... 
} 

여기는 FindAndReplace의 하위 클래스입니다. FindAndReplace의 AddToColumnsToSearch 메서드를 강제로 사용하려고하지만 하위 클래스에서 ColumnsToSearch의 Add 메서드를 계속 사용할 수 있습니다. _columnsToSearch를 읽기 전용으로 만들고 ColumnsToSearch에서 get 메서드 만 제공하면 ColumnsToSearch에서 추가 및 제거와 같은 메서드가 숨겨집니다.

public partial class StepsTableFindAndReplace : FindAndReplace { 

    protected override void ColumnCheckBox_CheckChanged(object sender, EventArgs e) { 
     CheckBox cb = sender as CheckBox; 

     //get the columnIndex (removed the actual "get" code to keep simpler) 
     int colIndex = 0; 

     //can still use Add and Remove, want it to be 
     //AddToColumnsToSearch(colIndex) and RemoveFromColumnsToSearch(colIndex) 
     if (cb.Checked) ColumnsToSearch.Add(colIndex); 
     else   ColumnsToSearch.Remove(colIndex); 
    } 

    ... 
} 

은 뭔가 내가 잘못 이해하지 못하는 /이 있습니까?

이 질문에 대한 대답은 나에게이 솔루션 (즉, 작동하지 않는) ... C# get and set properties for a List Collection

+0

IList <>를 구현하는 자신 만의 클래스를 빌드하고 Add 메서드를 호출 할 때 요구 사항을 구현할 수 있습니다. –

답변

0

대신 List<T>ReadOnlyCollection<T> 노출 시도했다.

0

readonly 수정자는 컬렉션을 읽기 전용으로 설정하지 않습니다. 필드를 생성자 바깥에 설정하는 것을 막을뿐입니다. 공개 속성은 IReadOnlyCollection<int>으로 표시되어야하며 하위 입력란은 목록을 수정할 수 있도록 protected이되어야합니다.

1

readonly 수정 자만 재 할당을 방지하고 ReadOnlyCollection<T>을 사용하면 런타임에 변경하려는대로 수행하지 않습니다.

대신 변경할 수 있습니다 수정에 따라 자체를 정렬합니다 protected SortedSet<int>,에 private List<int> :

public abstract partial class FindAndReplace : Form 
{ 
    protected readonly SortedSet<int> _columnsToSearch = new SortedSet<int>(); 

    // ... 

그런 다음 직접 파생 된 클래스에서 액세스 할 수 있습니다

if (cb.Checked) 
{ 
    _columnsToSearch.Add(colIndex); 
} 
else 
{ 
    _columnsToSearch.Remove(colIndex); 
} 

그리고 다음을 반환 게터 액세스시 수집, 예 : ToArray() :

후자는 연결이 끊어진 시나리오를 생성하는 10
public IEnumerable<int> ColumnsToSearch 
{ 
    get 
    { 
     return _columnsToSearch.ToArray(); 
    } 
} 

참고 : ColumnsToSearch 접근은 List<T>에 대한 래퍼입니다 ReadOnlyCollection에 반하는 그 순간, 당신에게 _columnsToSearch의 사본을 제공합니다.

+0

사용자 지정 추가 및 제거 방법보다 목록을 정렬하는 것이 더 좋은 방법일까요? –

+0

이 방법은 목록을 정렬 된 상태로 유지하고 사용자 지정 추가 및 제거 메서드가 필요하지 않으므로 사용자의 질문을 이해할 수 없습니다. – CodeCaster

+0

CheckChanged 이벤트 처리기가 하위 클래스에 있으므로 _columnsToSearch에 추가 또는 제거를 수행 할 수 없습니다. 이 이벤트 핸들러는 추상 클래스가 수행 할 수없는 열 인덱스를 가져 오는 메소드가 없기 때문에 서브 클래 싱 된 버전에 있어야합니다. –