2009-08-07 28 views
2

Ich habe eine Sammlung von Instanzen der Klasse A. An einem bestimmten Punkt erkennt eine Instanz von A, dass es sich selbst löschen soll. Ich möchte die Sammlung darüber informieren, aber ich möchte nicht, dass A etwas über die Sammlung weiß.Entfernen aus einer Sammlung

Was ist der beste Weg, um darüber zu gehen? Es scheint mir, als ob ein Wissen über die Sammlung sehr schlecht ist, aber wenn ich falsch liege, lassen Sie es mich wissen. Im Moment denke ich daran, etwas wie eine Instanz von A zu verwenden, um ein Ereignis auszulösen, zu dem die Sammlung gehört. Wenn das Ereignis von der Sammlung erfasst wird, entfernen Sie die Instanz, die es ausgelöst hat.

Irgendwelche Ideen auf, dies hilfreich sein würde, dank

+0

Zwei Fragen: Verwenden Sie eine Sprache, die Garbage Collection unterstützt? Verwenden Sie eine Sprache, in die Ereignisse integriert sind? –

+0

keine Garbage-Collection, aber ja zur Ereignisbehandlung – Ori

Antwort

0

in Bezug auf Design-Muster Setzen Sie die Beobachter-Muster beschreiben (Alias: Publish/Subscribe).

Instanz von A wird einen Listener halten. Wenn A gelöscht wird, ruft A die Methode onDelete für den Listener auf, der sich selbst als Parameter übergibt. Die Sammlung implementiert die Listener-Schnittstelle.

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

+0

Aber in dem, was Sie beschreiben, muss A nicht wissen, dass es in einer Sammlung ist, eine OnDelete-Methode aufzurufen? – David

+0

ja ich hatte daran gedacht, aber es scheint wie starke Kopplung. – Ori

+0

A ist mit einer Schnittstelle verbunden, die eine onDelete() -Methode definiert. Es ist nicht mit der Sammlung selbst gekoppelt. –

1

Ein Ereignis ist wahrscheinlich die beste Lösung.

Wenn die Auflistung eine ungeordnete Auflistung (ICollection in .NET) ist, gibt es auch eine andere Lösung. Sie könnten Ihrer Klasse A eine IsDeleted-Eigenschaft hinzufügen, die Sie auf true setzen und dann löschen. In Ihrer Sammelklasse könnten Sie dann so tun, als wären die Objekte, die IsDeleted = true haben, nicht vorhanden.

Etwas wie folgt aus:

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 
} 
Verwandte Themen