यह मैं क्या करने की कोशिश कर रहा है के बारे में एक उदाहरण है:मैं इस कोड को कैसे बेहतर बना सकते हैं: विरासत और IEquatable <>
public class Foo : IEquatable<Foo>
{
public bool Equals(Foo other)
{
Type type1 = this.GetType();
Type type2 = other.GetType();
if (type1 != type2)
return false;
if (type1 == typeof(A))
{
A a = (A)this;
A b = (A)other;
return a.Equals(b);
}
else if (type1 == typeof(B))
{
B c = (B)this;
B d = (B)other;
return c.Equals(d);
}
else
{
throw new Exception("Something is wrong");
}
}
}
public class A : Foo, IEquatable<A>
{
public int Number1 { get; set; }
public int Number2 { get; set; }
public bool Equals(A other)
{
return this.Number1 == other.Number1 && this.Number2 == other.Number2;
}
}
public class B : Foo, IEquatable<B>
{
public int Number1 { get; set; }
public int Number2 { get; set; }
public int Number3 { get; set; }
public bool Equals(B other)
{
return this.Number1 == other.Number1 && this.Number2 == other.Number2 && this.Number3 == other.Number3;
}
}
लेकिन जैसा कि आप ऊपर देख सकते हैं, मैं कई सशर्त, उपयोग करने के लिए होगा वास्तविक प्रकार की पहचान करने के लिए 'अगर'। समस्या यह है कि मुझे बेस क्लास का उपयोग करना है। उदाहरण के लिए:
A a = new A();
Foo foo = a;
foo.Equals(another);
आपको पहली जगह 'IEquatable' क्यों चाहिए? यह यहां कोई मूल्य नहीं जोड़ रहा है। बस सुनिश्चित करें कि subtypes (समझदारी से) 'ऑब्जेक्ट। GetHashCode' और 'object.Equals (ऑब्जेक्ट)' को ओवरराइड करें, मौजूदा' IEquatable 'कार्यान्वयन के अतिरिक्त। फिर आपको मुफ्त में आभासी विधि प्रेषण मिलता है, और यह कई और स्थितियों में काम करेगा। –
Ani
@ एनी क्या आप मुझे एक उदाहरण दिखाएंगे? –
हम्म। ये कक्षाएं अजीब लगती हैं। फू का उद्देश्य क्या है क्योंकि इसमें कोई गुण नहीं है? इसके अलावा यदि बी सिर्फ एक नंबर के साथ ए है तो बी को ए से क्यों प्राप्त नहीं होता है और केवल Foo के बजाय नंबर 3 जोड़ता है? – alun