2011-12-19 27 views
15

मैं लागू करने के लिए (सी #) एक कक्षा में एक अंतरफलक विधि, के रूप में इंटरफ़ेस में निर्धारित आधार प्रकार के बजाय एक व्युत्पन्न प्रकार लौटने कोशिश कर रहा हूँ:अधिभावी इंटरफ़ेस विधि वापसी प्रकार

interface IFactory 
{ 
    BaseCar GetCar(); 
} 

class MyFactory : IFactory 
{ 
    MyCar GetCar() 
    { 
    } 
} 

कहाँ, ज़ाहिर है:

class MyCar : BaseCar 
{ 

} 

हालांकि, निम्न त्रुटि होता है:

'MyFactory' इंटरफेस सदस्य को लागू नहीं करता है 'IFactory.GetCar()'। 'MyFactory.BaseCar()' IFactory.GetCar() 'को कार्यान्वित नहीं कर सकता है क्योंकि इसमें' बेसकार 'का मिलान करने वाला रिटर्न प्रकार नहीं है।

क्या कोई मुझे बता सकता है कि यह क्यों विफल रहता है, और इसके आसपास काम करने का सबसे अच्छा तरीका कैसे होगा?

+0

यह डुप्लिकेट है कार्यान्वित: [ "इंटरफ़ेस कार्यान्वित नहीं" जब व्युत्पन्न प्रकार रिटर्निंग] (http://stackoverflow.com/questions/1121283/ इंटरफ़ेस-नहीं-कार्यान्वित-कब-लौटने-व्युत्पन्न-प्रकार), और [इंटरफेस द्वारा निर्दिष्ट गुणों के लिए [पॉलिमॉर्फिज्म] (http://stackoverflow.com/questions/3670069/polymorphism-for-properties- निर्दिष्ट-by-interfaces) –

+0

@Austin मैंने अपनी टिप्पणी माफ कर दी .. – MethodMan

+0

धन्यवाद @ कोड वाई-ग्रे, किसी भी तरह पहले उन लिंक को याद किया। – iDPWF1

उत्तर

16

जेनेरिक्स उपयोग

interface IFactory<T> where T: BaseCar 
{ 
    T GetCar(); 
} 

class MyFactory : IFactory<MyCar> 
{ 
    MyCar GetCar() 
    { 
    } 
} 


class MyCar : BaseCar 
{ 

} 
+0

'माईफैक्टरी 'में' गेटकार 'सार्वजनिक होना चाहिए, और' टी' कॉन्वर्सेंट होना चाहिए, इसलिए यदि आप सी # 4.0 का उपयोग करते हैं तो इंटरफ़ेस पर' आउट 'के साथ आप इसे चिह्नित कर सकते हैं। – vcsjones

+0

@vcsjones: यदि बेसफैक्टरी IFactory लागू करता है और DerivedFactory बेसफैक्टरी को प्राप्त करता है लेकिन IFactory लागू करता है, तो क्या कोई गारंटी है, कॉन्वर्सिस का उपयोग करते समय, एक व्युत्पन्न फैक्टरी का उपयोग IFactory के रूप में GetCar के व्युत्पन्न फैक्ट्री कार्यान्वयन का उपयोग करेगा? – supercat

4

इंटरफेस को लागू करने के लिए आपके GetCar विधि को BaseCar वापस करना होगा। जैसा कि त्रुटि कहती है, कक्षा 'विधि का रिटर्न प्रकार इंटरफ़ेस के विधि के रिटर्न प्रकार से मेल खाना चाहिए।

कुछ भी नहीं आप MyCar का उदाहरण बनाकर, तो वह वापस आ रहा रोक नहीं है:

BaseCar GetCar() 
{ 
    return new MyCar(); 
} 

एक वैकल्पिक, आप नए वर्ग के द्वारा लिखा गया संस्करण प्राप्त करना चाहते हैं, प्रति John's answer के रूप में जेनरिक उपयोग करने के लिए है।

+1

क्या आपको वाकई कास्ट करना है? –

+0

अच्छा बिंदु, सही। –

+0

इस मामले में, क्योंकि, कई परिदृश्यों में गेटकार() का उपयोग कई अन्य परिदृश्यों में किया जाता है, जहां उन्हें माईकर, माईओथरकर इत्यादि को वापस करने की आवश्यकता होती है, बिना उन्हें बेसकायर से हर बार डालना पड़ता है। – iDPWF1

7

2 तरीके यह पूरा करने के हैं। आप या तो जेनिक्स का उपयोग कर सकते हैं या स्पष्ट रूप से इंटरफेस सदस्यों को लागू कर सकते हैं।

जेनेरिक्स

interface IFactory<T> where T: BaseCar 
{ 
    T GetCar(); 
} 

class MyFactory : IFactory<MyCar> 
{ 
    MyCar GetCar() 
    { 
    } 
} 

स्पष्ट रूप से सदस्यों

interface IFactory 
{ 
    BaseCar GetCar(); 
} 

class MyFactory : IFactory 
{ 
    BaseCar IFactory.GetCar() 
    { 
     return GetCar(); 
    } 

    MyCar GetCar() 
    { 
    } 
} 
संबंधित मुद्दे