2 Stimmen

Entfernen aus einer Sammlung

Ich habe eine Sammlung von Instanzen der Klasse A. Irgendwann stellt eine Instanz von A fest, dass sie sich selbst löschen sollte. Ich möchte die Sammlung darüber informieren, aber ich möchte nicht, dass A etwas über die Sammlung erfährt.

Wie kann ich am besten vorgehen? Es scheint mir wie A zu wissen, über die Sammlung ist sehr schlechte Kopplung, aber wenn ich falsch bin, lassen Sie mich wissen. Im Moment denke ich an die Verwendung von etwas wie, eine Instanz von A kann ein Ereignis auslösen, auf die die Sammlung hört. Dann, wenn das Ereignis von der Sammlung abgefangen wird, entfernen Sie die Instanz, die es ausgelöst hat.

Jede Idee zu diesem Thema wäre hilfreich, danke

1voto

Mikael Sundberg Punkte 4457

Eine Veranstaltung ist wahrscheinlich die beste Lösung.

Wenn die Sammlung eine ungeordnete Sammlung (ICollection in .NET) ist, gibt es auch eine andere Lösung. Sie könnten eine IsDeleted-Eigenschaft zu Ihrer Klasse A hinzufügen, die Sie auf true setzen, dann wird sie gelöscht. In Ihrer Auflistungsklasse könnten Sie dann so tun, als ob die Objekte, die IsDeleted=true haben, nicht vorhanden wären.

Etwa so:

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
}

0voto

Itay Maman Punkte 29121

In Bezug auf das Entwurfsmuster beschreiben Sie das Observer-Muster (AKA: Publish/subscribe).

Die Instanz von A wird einen Hörer enthalten. Wenn A gelöscht wird, ruft A die onDelete-Methode für den Listener auf und übergibt sich selbst als Parameter. Die Sammlung implementiert die Schnittstelle des Listeners.

Eine weitere Alternative ist das Chain-of-Responsibility-Muster.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X