3 Stimmen

Kann das Verhalten für == für eine Schnittstellenreferenz definiert werden?

Wenn eine Schnittstelle IEquatable erbt, kann die implementierende Klasse das Verhalten der Methode Equals definieren. Ist es möglich, das Verhalten von == Operationen zu definieren?

public interface IFoo : IEquatable  
{}  

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

Überprüfung, ob zwei IFoo-Referenzen gleich sind, indem ihre Werte verglichen werden:

IFoo X = new Foo();  
IFoo Y = new Foo();

if (X.Equals(Y))  
{  
     // Do something  
}

Ist es möglich, die if (X == Y) die Methode Equals auf Foo? anwenden?

6voto

Jon Skeet Punkte 1325502

Nein - Sie können in Schnittstellen keine Operatoren angeben (vor allem, weil Operatoren statisch sind). Der Compiler bestimmt die aufzurufende Überladung von == rein auf der Grundlage ihres statischen Typs (d.h. Polymorphismus ist nicht involviert) und Schnittstellen können nicht den Code angeben, der besagt: "Gib das Ergebnis des Aufrufs von X.Equals(Y) zurück".

0voto

Luc Touraille Punkte 76149

Nein, denn die Schnittstelle kann keine Operatorfunktionen enthalten. Eine Lösung wäre, IFoo zu einer abstrakten Klasse statt zu einer Schnittstelle zu machen:

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

Dadurch verlieren Sie natürlich die Flexibilität, die Ihnen Schnittstellen bieten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X