接口引用的“==”操作行为能否被定义?

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  
}

在Foo上使用Equals方法,是否可以使if (X == Y)成立?

2个回答

6

不行 - 你不能在接口中指定运算符(主要是因为运算符是静态的)。编译器仅基于它们的静态类型(即没有涉及多态)来确定调用哪个 == 的重载,并且接口无法指定代码以返回“调用X.Equals(Y)的结果”。


这就是我在使用泛型时最想念的东西,哦...还有特化。 - Coincoin

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
    }
}

当然,这会使您失去接口提供的灵活性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接