代码之家  ›  专栏  ›  技术社区  ›  Leander

可以为接口引用定义==的行为吗?

  •  3
  • Leander  · 技术社区  · 16 年前

    如果接口继承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方法?

    2 回复  |  直到 14 年前
        1
  •  6
  •   Jon Skeet    16 年前

    不-不能在接口中指定运算符(主要是因为运算符是静态的)。编译器仅根据其静态类型(即不涉及多态性)确定要调用的==重载,而接口无法指定代码来表示“返回调用x.equals(y)的结果”。

        2
  •  0
  •   tvanfosson    16 年前

    不,因为接口不能包含运算符函数。解决方案是使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
        }
    }
    

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