1

エラー 1 'Koordinates.Vieta' はインターフェイス メンバー 'System.IComparable.CompareTo(object)' を実装していません

コード:

    public class Vieta : IComparable //error is thrown here, on "Vieta"
{
    public double x, y; 
    //constructor
    public Vieta(double a, double b)
    {
        x = a; y = b;
    }
    //read only parameter
    public double ilgis
    {
        get
        {
            return Math.Sqrt(x * x + y * y);
        }
    }

    public int CompareTo(Vieta other)
    {
        if (other == null) return 1;
        return other.ilgis.CompareTo(this.ilgis);
    }
}
4

2 に答える 2

2

Vietaクラスのインスタンスを取る比較メソッドがあります。インターフェイスはIComparableメソッドを宣言しますCompareTo(object)(パラメーターは type でなければならないことに注意してくださいobject)。

もちろん、強い型付けされた CompareTo メソッドを使用する方がよいでしょう。インターフェイスを実装することもできIComparable<T>ます。

私の提案は、それを行い、IComparableインターフェースを明示的に実装することです。次に、次のような結果になります。

public class Vieta : IComparable, IComparable<Vieta>
{

    IComparable.CompareTo( object obj )
    {

       var other = obj as Vieta;

       if( other == null ) return false;

       return CompareTo(other);

    }


    public int CompareTo( Vieta other )
    {
         // Implement your compare logic here.
    }

}

IComparableインターフェイスを明示的に実装することにより、CompareTo(object)メソッドは IntelliSense から隠されます。実際、クラスをインターフェイス型にキャストした場合 (または、そのクラスのインスタンスがIComparableパラメーターを取るメソッドに渡された場合など) にのみ、そのメソッドを呼び出すことができます。

于 2012-11-21T21:53:10.647 に答える
2

クラスを次のように変更します。

public class Vieta : IComparable<Vieta>

IComparableは を定義int CompareTo(object)し、ジェネリックIComparable<T>は を定義しint CompareTo(T)ます。

于 2012-11-21T21:54:23.087 に答える