3

インターフェイスが IEquatable を継承する場合、実装クラスは Equals メソッドの動作を定義できます。== 操作の動作を定義することは可能ですか?

public interface IFoo : IEquatable  
{}  

public class Foo : IFoo  
{  
    // IEquatable.Equals  
    public bool Equals(IFoo other)  
    {  
        // Compare by value here...
    }  
}

値を比較して、2 つの IFoo 参照が等しいことを確認するには、次のようにします。

IFoo X = new Foo();  
IFoo Y = new Foo();

if (X.Equals(Y))  
{  
     // Do something  
}

if (X == Y)Foo で Equals メソッドを使用することは可能ですか?

4

2 に答える 2

6

いいえ - インターフェイスで演算子を指定することはできません (ほとんどの場合、演算子は静的であるため)。コンパイラは、純粋に静的な型に基づいて呼び出す == のオーバーロードを決定し (つまり、ポリモーフィズムは関係ありません)、インターフェイスは「X.Equals(Y) を呼び出した結果を返す」というコードを指定できません。

于 2008-11-04T13:01:12.237 に答える
0

いいえ、インターフェイスには演算子関数を含めることができないためです。解決策は、 IFoo を interface ではなく抽象クラスにすることです。

abstract class IFoo : IEquatable<IFoo> 
{
    public static bool operator ==(IFoo i1, IFoo i2) { return i1.Equals(i2); }
    public static bool operator !=(IFoo i1, IFoo i2) { return !i1.Equals(i2); }
    public abstract bool Equals(IFoo other);
}

class Foo : IFoo
{
    public override bool Equals(IFoo other)
    {
        // Compare
    }
}

もちろん、これにより、インターフェースが提供する柔軟性が失われます。

于 2008-11-04T13:10:38.647 に答える