3

如果接口继承了 IEquatable,则实现类可以定义 Equals 方法的行为。是否可以定义 == 操作的行为?

public interface IFoo : IEquatable  
{}  

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

通过比较它们的值来检查两个 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 成为抽象类而不是接口:

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 回答