удаление из коллекции - PullRequest
       37

удаление из коллекции

2 голосов
/ 07 августа 2009

У меня есть коллекция экземпляров класса А. В какой-то момент экземпляр A понимает, что он должен удалить себя. Я хочу проинформировать коллекцию об этом, но я не хочу, чтобы А. узнал что-либо о коллекции.

Как лучше всего это сделать? Мне кажется, что знание о коллекции - очень плохая связь, но если я ошибаюсь, дайте мне знать. Сейчас я думаю об использовании чего-то вроде экземпляра A, который может вызвать событие, которое слушает коллекция. Затем, когда событие перехватывается коллекцией, удалите экземпляр, который его вызвал.

Любые идеи по этому поводу были бы полезны, спасибо

Ответы [ 2 ]

1 голос
/ 07 августа 2009

Событие, вероятно, лучшее решение.

Если коллекция является неупорядоченной коллекцией (ICollection в .NET), есть и другое решение. Вы можете добавить свойство IsDeleted в свой класс A, для которого вы установите значение true, после чего оно будет удалено. В своем классе коллекции вы можете притвориться, что объектов с IsDeleted = true не существует.

Примерно так:

class A {
    public bool IsDeleted { get; set; }
}

class ACollection : ICollection<A> {
    private List<A> _innerList = new List<A>();

    #region ICollection<A> Members

    public void Add(A item) {
        _innerList.Add(item);
    }

    public void Clear() {
        _innerList.Clear();
    }

    public bool Contains(A item) {
        if(item.IsDeleted)
            return false;
        return _innerList.Contains(item);
    }

    public void CopyTo(A[] array, int arrayIndex) {
        throw new NotImplementedException();
    }

    public int Count {
        get {
            int count = 0;
            foreach(var item in _innerList) {
                if(!item.IsDeleted)
                    count++;
            }
            return count;
        }
    }

    public bool IsReadOnly {
        get { return false; }
    }

    public bool Remove(A item) {
        return _innerList.Remove(item);
    }

    #endregion

    #region IEnumerable<A> Members

    public IEnumerator<A> GetEnumerator() {
        foreach(var item in _innerList) {
            if(!item.IsDeleted)
                yield return item;
        }
    }

    #endregion

    #region IEnumerable Members

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
        foreach(var item in _innerList) {
            if(!item.IsDeleted)
                yield return item;
        }
    }

    #endregion
}
0 голосов
/ 07 августа 2009

С точки зрения шаблона проектирования вы описываете шаблон Observer (AKA: публикация / подписка).

Экземпляр A будет удерживать слушателя. Когда A удаляется, A вызывает метод onDelete для слушателя, передавая себя в качестве параметра. Коллекция будет реализовывать интерфейс слушателя.

Еще одна альтернатива - шаблон цепочки ответственности.

...