2012-07-11 2 views
6

मैं एक अंतरफलक है पर सामान्य इंटरफ़ेस का उपयोग करते हुए कई बारएक ही कक्षा

interface IInterface<E>{ 
    E Foo(); 
} 

मैं तो इस

class Bar : IInterface<String>, IInterface<Int32> { 
} 

की तरह एक वर्ग बनाने यह वास्तव में बहुत अच्छी तरह से बाहर काम करता है, को छोड़कर मैं एक परिभाषित करने की जरूरत इंटरफेस के साथ दो कार्यों में स्पष्ट, इस तरह:

class Bar : IInterface<String>, IInterface<Int32> { 
    String Foo(); 
    Int32 IInterface<Int32>.Foo(); 
} 

दोष यह है कि मुझे करना है हर बार एक कलाकार जब मैं फू() तक पहुंचना चाहता हूं जिसमें स्पष्ट इंटरफ़ेस है।

इससे निपटने के दौरान सबसे अच्छे अभ्यास क्या हैं?

मैं एक बहुत ही प्रदर्शन निर्भर आवेदन कर रहा हूं, इसलिए मैं वास्तव में प्रति सेकंड दस लाख कास्ट नहीं करना चाहता हूं। क्या यह कुछ ऐसा है जो जेआईटी पता लगाएगा, या क्या मुझे उदाहरण के एक कास्ट संस्करण को खुद ही स्टोर करना चाहिए?

मैंने इस विशिष्ट कोड का प्रयास नहीं किया है, लेकिन यह मेरे द्वारा किए जा रहे कार्यों के बहुत करीब दिखता है।

+0

कास्टिंग संदर्भ प्रकार पर लगभग कोई लागत नहीं है। – leppie

+0

मेरे कार्यक्रम में प्रत्येक पांचवें अतिरिक्त/गुणा को कास्ट शामिल है। मेरी धारणा यह है कि अतिरिक्त/गुणा इतना सस्ता है, कास्टिंग की लागत काफी हो जाती है। –

+0

इंटरफ़ेस कॉल से अधिक महंगा नहीं है। – leppie

उत्तर

11

आप वापसी प्रकार से ओवरराइड नहीं कर सकते, लेकिन आप कास्टिंग आप एक बाहर पैरामीटर में अपनी वापसी प्रकार बदल सकता है से बचने के लिए चाहते हैं:

interface IInterface<E> { 
    void Foo(out E result); 
} 

class Bar : IInterface<string>, IInterface<int> { 
    public void Foo(out string result) { 
     result = "x"; 
    } 
    public void Foo(out int result) { 
     result = 0; 
    } 
} 

static void Main(string[] args) { 
    Bar b = new Bar(); 
    int i; 
    b.Foo(out i); 
    string s; 
    b.Foo(out s); 
} 
+0

+1 दिलचस्प सोच :) – leppie

+0

@leppie: धन्यवाद :) –

+0

मुझे यह पसंद है! –