6

これは些細な質問かもしれませんが、これに関する情報は見つかりませんでした:型 T を実装することは「有害」であるか、悪い習慣と見なされますIComparable<S>か (T と S は2つの異なる型です)?

例:

class Foo : IComparable<int>
{
    public int CompareTo(int other)
    {
        if (other < i) return -1;
        if (other > i) return 1;

        return 0;
    }

    private int i;
}

この種のコードは避けるべきですか?もしそうなら、それはなぜですか?

4

3 に答える 3

6

少なくとも「奇妙」だと思います。特に、その時点で、通常の比較コントラクトの一部である対称的な比較は行われません。

あなたがやりたいことの他のどの実装よりも簡単な特定の状況がある場合、それは問題ありませんが、そのような状況に遭遇したことがあるとは言えません。このような比較は、ほとんどの場合、同種のコレクションなどをソートするために使用されます。

特定の状況を念頭に置いていましたか、それとも単に「関心のある」質問ですか?

于 2010-03-29T16:25:00.507 に答える
2

そのようなことを実装するのは派手です。しかし、それは良い習慣ではありません。

次のようなコードがあると想像してください。

Foo x = new Foo();

if( x.compareTo(15) > 0)
{
  //blah blah
}

「なんてこった! 15 を x と比較する方法は?」これにより、コードが読みにくくなります。

次のように関数として比較を追加することをお勧めします。 public int IsMoreThanPrivateI(int x);

于 2010-03-29T16:25:56.150 に答える
1

異なるクラスのオブジェクトを比較するための使用法を見ることができますが、IComparable(of T)が正しい根拠ではないと思います。このような比較が実際に機能するためには、オブジェクトが共通の標準形である必要があります。これは、すべてのオブジェクトが共通の祖先から派生しているか、共通のインターフェースを実装していることを意味します。さらに、この共通ベースにはSecondChanceCompareToメソッドが含まれていることをお勧めします。通常の比較メソッドは、比較対象の正確なタイプを認識しない場合は、渡されたオブジェクトのSecondChanceCompareメソッドに自分自身を渡す必要があります。

このタイプのものが役立つ可能性がある場所の例として、文字列を格納するクラスのファミリーを想像してください。文字列は単純なStringオブジェクトとして格納される場合がありますが、文字と繰り返し回数として格納される文字列もあれば、開始オフセットと長さなどとともに長い文字列への参照として格納される文字列もあります。 2つの文字列オブジェクトを「String」タイプに変換してから比較することで比較しますが、より良い比較手段が存在するシナリオはたくさんあります。たとえば、一方の文字列が「文字'Z'が100,000回繰り返される」として保存され、もう一方の文字列が「リテラル文字列' Dog'」として保存される場合、前者の文字列は、後者の最初の文字が'Z'未満。

基本的な「リテラル文字列」オブジェクトは、「繰り返し文字」文字列オブジェクトをリテラル文字列に変換する(コストのかかる操作)以外は、それ自体を「繰り返し文字」文字列オブジェクトと比較する方法を知らない場合がありますが、後者の「SecondChanceCompare」メソッドを呼び出すことはできます。これは、それ自体をリテラル文字列と比較する方法を知っています。

于 2011-06-26T15:41:21.530 に答える