Можно ли определить поведение для == для ссылки на интерфейс? - PullRequest
3 голосов
/ 04 ноября 2008

Если интерфейс наследует 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) использовать метод Equals на Foo?

Ответы [ 2 ]

6 голосов
/ 04 ноября 2008

Нет - вы не можете указывать операторы в интерфейсах (в основном потому, что операторы являются статическими). Компилятор определяет, какую перегрузку == вызывать, основываясь исключительно на их статическом типе (т. Е. Полиморфизм не задействован), и интерфейсы не могут указать код, чтобы сказать «вернуть результат вызова X.Equals (Y)». *

0 голосов
/ 04 ноября 2008

Нет, потому что интерфейс не может содержать операторские функции. Решением было бы сделать 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
    }
}

Конечно, это приводит к потере гибкости интерфейсов.

...