क्या इंटरफ़ेस संदर्भ के लिए == को परिभाषित किया जा सकता है?

यदि एक इंटरफ़ेस आईक्वाटेबल को प्राप्त करता है तो कार्यान्वयन वर्ग बराबर विधि के व्यवहार को परिभाषित कर सकता है। क्या == संचालन के व्यवहार को परिभाषित करना संभव है?

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) फू पर समान विधि का उपयोग करना संभव है?

0

2 उत्तर

नहीं - आप इंटरफेस में ऑपरेटरों को निर्दिष्ट नहीं कर सकते (ज्यादातर क्योंकि ऑपरेटरों स्थिर हैं)। कंपाइलर निर्धारित करता है कि == से कॉल करने के लिए कौन से ओवरलोड को अपने स्थिर प्रकार (यानी पॉलिमॉर्फिज्म शामिल नहीं है) पर आधारित है और इंटरफेस कोड को निर्दिष्ट नहीं कर सकता है "X.Equals (Y) को कॉल करने के परिणाम को वापस करें"।

0
जोड़ा
और जेनिक्स, ओह ... और विशेषज्ञता का उपयोग करते समय मुझे सबसे ज्यादा याद आती है।
जोड़ा लेखक Coincoin, स्रोत

नहीं, क्योंकि इंटरफेस में ऑपरेटर फ़ंक्शन नहीं हो सकते हैं। इंटरफ़ेस की बजाय IFoo को एक अमूर्त वर्ग बनाना एक समाधान होगा:

abstract class IFoo : IEquatable 
{
    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
    }
}

बेशक, यह आपको इंटरफेस द्वारा प्रदान की गई लचीलापन खो देता है।

0
जोड़ा