2009-08-07 27 views
2

私はクラスAのインスタンスのコレクションを持っています。 ある時点で、Aのインスタンスは自分自身を削除する必要があることを認識します。私はこれのコレクションを知らせたいが、コレクションに何か知りたいとは思っていない。コレクションから削除する

これについてはどのような方法が最適ですか?それは私のコレクションのことを知っているように思われるカップリングが非常に悪いですが、私が間違っている場合は私に知らせてください。今、私はAのインスタンスがイベントを発生させるようなものを使用することを考えています。そのイベントには、コレクションがリスニングしています。次に、イベントがコレクションによってキャッチされたら、それを起動したインスタンスを削除します。

この上の任意のアイデアは、感謝

+0

つの質問:あなたは、ガベージコレクションをサポートしている言語を使用していますか?イベントを組み込んだ言語を使用していますか? –

+0

ガベージコレクションはありませんが、イベント処理の場合は – Ori

答えて

0

あなたはObserverパターンを記述しているデザインパターンの面で置くことに役立つだろう(AKA:パブリッシュ/サブスクライブ)。

インスタンスAはリスナーを保持します。 Aが削除されると、Aはそれ自身をパラメーターとして渡すリスナーに対してonDeleteメソッドを呼び出します。コレクションはリスナーインタフェースを実装します。

もう1つの選択肢は、責任連鎖パターンです。

+0

あなたは何を記述していますか?AはOnDeleteメソッドを呼び出すコレクション内にあることを知る必要はありませんか? – David

+0

はい、私はこれを考えていましたが、強い結合のようです。 – Ori

+0

Aは、onDelete()メソッドを定義するインタフェースと結合されています。それはコレクション自体と結合されていません。 –

1

おそらくイベントが最適な解決策です。

コレクションが順序付けられていないコレクション(.NETのICollection)である場合は、別の解決策もあります。クラスAにIsDeletedプロパティを追加して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 
} 
関連する問題