1

そのため、CollectionBase をカスタム コレクションの継承クラスとして利用しています。知識を繰り返さないように(DRYの原則に従って)、抽象クラスを介してCollectionBaseを利用しています。抽象クラスもジェネリック クラスとして定義されます。クラスを実装する方法は次のとおりです。

 public abstract class GenericCollectionBase<T,C> : CollectionBase
 {
      //Indexders, virtual methods for Add, Contains, IndexOf, etc
 }

私はこれを利用しているので、これらの基本メソッドを 10 以上のクラスに実装する必要はありません。

私の質問は、次のように Equals メソッドをオーバーライドするときに、これをやりすぎているかどうかです。

    public override bool Equals(object obj)
    {
        if (obj is C)
        {
            GenericCollectionBase<T, C> collB = 
                obj as GenericCollectionBase<T, C>;

            if (this.Count == collB.Count)
            {
                for (int i = 0; i < this.Count; ++i)
                {
                    if (!this[i].Equals(collB[i]))
                        return false;
                }
                return true;
            }
        }
        return false;
    }

アブストラクトで多くのことを達成しようとしていますか、それとも正しい方法で行っていますか?

編集:これは.Net 2.0用に書かれており、LINQなどを利用するために3.5にアクセスすることはできません

4

4 に答える 4

3

あなたがやりすぎているとは思えません。抽象クラスが実装をまったく持たないこと、または機能を定義する他のメソッドを持たないことを意図している場合、それらはインターフェースになります。

私が変更する唯一のことは、 と の比較に equals の代わりに使用することEqualityComparer<T>です。this[i]collB[i]

于 2009-02-12T16:52:12.320 に答える
1

まず、これは奇妙です:

    if (obj is C)
    {
        GenericCollectionBase<T, C> collB = obj as GenericCollectionBase<T, C>;

私はあなたがそれを意味したと仮定します:

    GenericCollectionBase<T, C> collB = obj as GenericCollectionBase<T, C>;
    if (collB != null)
    {
        ...

これは考えすぎだと思いますが、同じコンテンツを持つ 2 つの異なるコレクションを同等と見なす必要がある場合を除きます。このロジックを、明示的に呼び出される別のメソッドまたは等値比較子に配置します。

于 2009-02-12T16:57:45.770 に答える
0

IDictionary に対して拡張メソッドを作成すると、はるかに便利になります。LINQ の Intersect のような便利なメソッドもあります。

于 2009-02-12T16:51:23.323 に答える
0

あなたが達成しようとしていることが多すぎるかどうかはわかりませんが、間違ったことを達成しようとしていると思います。コレクションにそのタイプの等価性が必要な場合もありますが、オプトインであり、タイプの名前から明らかであるべきです。私はあなたが使用している等値のタイプで ListValue<> を作成しましたが、それは常に不変でもあります。

また、このタイプの等価性チェックを行う場合、object.ReferenceEquals を使用した初期テストにより、オブジェクトをそれ自体と比較するときに大きなコレクションを反復処理する必要がなくなります。

于 2009-10-15T14:43:14.393 に答える