【问题标题】:Can the behavior for == be defined for an interface reference?可以为接口引用定义 == 的行为吗?
【发布时间】:2008-11-04 12:59:24
【问题描述】:

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

【问题讨论】:

    标签: c# interface equals equals-operator


    【解决方案1】:

    不 - 您不能在接口中指定运算符(主要是因为运算符是静态的)。编译器完全根据静态类型(即不涉及多态性)确定要调用的 == 的哪个重载,并且接口无法指定代码来表示“返回调用 X.Equals(Y) 的结果”。

    【讨论】:

    • 而这是我在使用泛型时最怀念的,哦...和专业化。
    【解决方案2】:

    不,因为接口不能包含操作符函数。一个解决方案是让 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
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2012-10-16
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2012-03-24
      • 2011-03-01
      相关资源
      最近更新 更多