2

次のクラスがあるとしましょう:

public sealed class ScaleValue : 
    IComparable, IComparable<ScaleValue>, IEquatable<ScaleValue>
{
    public double Value
    { get; set;}
    public string Definition
    { get; set;}

    // interface methods
    ...
}

クラスを a に匹敵するものにしたい場合は、そのようdoubleに含めIComparable<double>て実装する必要がありますか、それとも別の方法で行う必要がありますか?

そして、クラスを double に匹敵するようにしたい場合は、 ?double.CompareToと同じ結果が得られるはずです。ScaleValue.CompareTo

そしてどうEqualsですか?

私は自分の設計で責任を間違っていると思います。私の最善の選択肢は、ContainsValue(double Value)メソッドを使用して Scale クラスを作成することだと思います。このようにして、価値を調べて、必要な場所に責任を持たせることができます。

4

2 に答える 2

0

あなたのクラスが何に匹敵するかはあなた次第です。インターフェイスの非ジェネリックバージョンは; メソッドの実装では、基本的にオブジェクトのタイプをスニッフィングできます (そうでない場合)。IComparableobjectCompareTonull

のジェネリック バージョンを使用する場合IComparable<T>、型パラメーターが何であれ、厳密に型指定された比較メソッドを実装するというステートメントを作成していますT

一般に、IComparable<T>1 つのタイプの実装がある場合は、おそらく実装も必要IEquatable<T>です。

IComparable/IComparable<T>実装があるということは、構造によって表現されているものが自然な順序になっていることを意味します。順序付けは、2 つのインスタンスが等しいことも意味します。つまり、instance が instance aofTより大きくも小さくもない場合bT、等しくなければなりません。

そのために、 を実装する場合IComparable/IComparable<T>、ロジックは を実装することを指示しますIEquatable/IEquatable<T>

もちろん、 を実装するときはIEquatable/IEquatable<T>、 と をオーバーライドする必要がEqualsありますGetHashCode

つまり、すべての比較演算子をオーバーライドする必要があります。

  • ==(これは を意味します!=)
  • <<=
  • >>=
于 2013-10-06T13:39:53.960 に答える
0

クラスにまったく新しいコレクション型を実装するか、ある種の拡張メソッドを使用しない限り、contains メソッドを使用してコレクション内のオブジェクトを異なる型のオブジェクトと比較することはできません!!!

于 2013-10-07T17:51:59.910 に答える