2009-11-06 9 views
5

मैं सी # में एक अंतरफलक है कि एक विधि है जो हमेशा लागू करने वर्ग की एक वस्तु देता है, इस प्रकार परिभाषित करता है बनाना चाहते:क्या मैं एक कार्यान्वयन वर्ग को अपने स्वयं के प्रकार की वस्तु वापस करने के लिए मजबूर कर सकता हूं?

public interface IParser { 
    IParser Parse(string s); 
} 

public class Parser : IParser { 
    public Parser Parse(string s) { 
     return new Parser(s); 
    } 
} 

मैं अपनी ही प्रकार का ऑब्जेक्ट वापस जाने के लिए एक को लागू करने के लिए मजबूर वर्ग कर सकते हैं? यदि संभव हो, तो कैसे? या जेनिक्स यहाँ जवाब है?

एनबी: कोड सिर्फ एक उदाहरण है, न कुछ है कि चलाने के लिए माना जाता है।

+0

आपने मुझे बहुत उत्सुक बना दिया है: आप ऐसा करने की कोशिश क्यों कर रहे हैं? आम तौर पर, एक इंटरफ़ेस को परिभाषित करने का बिंदु यह है कि क्लाइंट कोड इस बात पर भरोसा कर सकता है कि किसी ऑब्जेक्ट को किसी ऑब्जेक्ट पर परिभाषित किए बिना किसी ऑब्जेक्ट पर परिभाषित किया गया है या उस वस्तु का ठोस प्रकार क्या है। यह ओओपी की बड़ी ताकत है। यह क्या है कि आप ऐसा करके पूरा करने की कोशिश कर रहे हैं? –

+0

खैर, मेरा विचार था कि इस इंटरफ़ेस को आप हमेशा भरोसा कर सकते हैं कि इंटरफ़ेस को लागू करने वाले वर्गों में यह विधि होगी और वे हमेशा अपना स्वयं का प्रकार वापस कर देंगे। लेकिन जैसा कि आप कहते हैं, यह शायद सबसे अच्छा ओओ डिज़ाइन नहीं हो सकता है और मैं इसे एक विधि के लिए त्यागने जा रहा हूं जो इसके बजाय इंटरफ़ेस प्रकार देता है। – Cros

उत्तर

8

जेनेरिक्स जवाब है यहाँ।

public interface IParser<T> where T:IParser<T> { 
    T Parse(string s); 
} 

public class Parser : IParser<Parser> { 
    public Parser Parse(string s) { 
     return new Parser(s); 
    } 
} 
+0

अच्छा काम ... मैं बस एक ही चीज़ के लिए अपने कोड का परीक्षण कर रहा था। +1 – jheddings

+0

मैं तुरंत कोशिश कर रहा हूं। – Cros

+0

ऐसा लगता है कि जब आप इस तरह इंटरफ़ेस जेनेरिक बनाते हैं, तो आपको हर जगह टी निर्दिष्ट करना होगा, जिसका उपयोग आप आईएसईलेक्शन को आपके द्वारा उपयोग किए जाने वाले प्रकार के लिए निर्दिष्ट के रूप में करते हैं। अब मैं सिर्फ एक सूची नहीं बना सकता लेकिन अब इसे एक सूची <आईपर्सर > होना चाहिए। क्या मैं सही हूँ? तो यह वह समाधान नहीं है जिसे मैं ढूंढ रहा हूं, दुख की बात है। – Cros

1

हाँ, और यह जाना जाता है the factory pattern के रूप में, केवल कि आम तौर पर इस एक निजी निर्माता के उपयोग के साथ पूरित है और उदाहरण के लिए विधि स्थिर लौटने उदाहरण बनाने:

public class Parser : IParser { 

    private Parser(string s) { 
     //Do something with s, probably store it in a field 
    } 

    public static IParser GetNewParser(string s) { 
     return new Parser(s); 
    } 
} 
+0

मुझे लगता है कि कुंजी वाक्यांश है "... अपने कार्यान्वयन वर्ग को अपने स्वयं के प्रकार की वस्तु वापस करने के लिए मजबूर करें ..." –

+0

यह वास्तव में "हां/नहीं" प्रश्न नहीं था। मैं समझना चाहता हूं कि सी # में यह कैसे किया जाता है, यदि यह संभव है। – Cros

0

आप जेनरिक के साथ ऐसा कर सकते हैं, लेकिन शायद मैं इंटरफ़ेस का एक उदाहरण लौटने के साथ चिपक जाऊंगा। ध्यान दें कि चूंकि कक्षा इंटरफ़ेस लागू करती है, इसके उदाहरण को वापस करना ठीक है - यह उस प्रकार और इंटरफ़ेस का भी उदाहरण होगा।

public class Parser : I Parser 
{ 
    public IParser Parser(string s) 
    { 
     return Parser(s); 
    } 
} 
5

इंटरफ़ेस घोषणा में नहीं, नहीं। सबसे अच्छा आप का प्रबंधन कर सकते जेनरिक के साथ है:

public interface IParser<T> 
    where T: IParser<T> 
{ 
    T Parse(string s); 
} 

public class Parser 
: IParser<Parser> 
{ 
    public Parser Parse(string s) 
    { 
     return new Parser(s); 
    } 
} 

यह नहीं बल कार्यान्वयन यह खुद प्रकार है वापस जाने के लिए है, लेकिन कम से कम यह ऐसा करना अनुमति देता है। यही कारण है कि IClonable इंटरफ़ेस एक विशिष्ट प्रकार की बजाय Clone विधि से ऑब्जेक्ट देता है।

---- संपादित ----

कुछ इस प्रश्न पर याद करने के लिए: मान लीजिए कि मेरे कोड, जिसके लिए आप कार्यान्वयन के किसी भी ज्ञान की जरूरत नहीं है, रिटर्न एक IParser, और अपने कोड चलो Parse विधि को कॉल करता है। IParser संदर्भ के ठोस प्रकार को जानने के लिए आप किस वस्तु को वापस आने की उम्मीद करते हैं? मुझे लगता है कि आप ऐसा कुछ करने के लिए इंटरफेस का उपयोग करने की कोशिश कर रहे हैं जिसका वे उपयोग नहीं कर रहे हैं ...

+1

+1 अनुरोधित कार्यान्वयन को मजबूर नहीं करता है। आप बस एक और आईपसर कार्यान्वयन को आसानी से वापस कर सकते हैं। AFAIK भाषा स्तर पर इस चेक को लागू करने का कोई तरीका नहीं है; यह सबसे नज़दीकी चीज है जिसे आप प्राप्त करेंगे। –

संबंधित मुद्दे

 संबंधित मुद्दे