2010-02-28 13 views
7

निम्नलिखित क्लाइंट कोड को देखते हुए:क्या एक कन्स्ट्रक्टर एक उप-क्लास लौटा सकता है?

var obj = new Class1(); 

क्या क्लास 1 के कन्स्ट्रक्टर को संशोधित करने का कोई तरीका है ताकि यह वास्तव में इसके बजाय उप-वर्ग (या कुछ अन्य वैकल्पिक कार्यान्वयन) लौटाए?

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

मुझे लगता है कि जवाब नहीं है, लेकिन मुझे आश्चर्य है कि ऐसा करने का कुछ चालाक तरीका है या नहीं।

+4

हम एक सुविधा "एक्सटेंशन नया" जोड़ने पर विचार कर रहे हैं जो आपको अनिवार्य रूप से एक स्थैतिक फैक्ट्री विधि बनाने की अनुमति देगा जिसे "नया" ऑपरेटर उपयोग किया जाने पर कॉल किया जाएगा, क्योंकि एक्सटेंशन विधियों को "।" ऑपरेटर का उपयोग किया जाता है। यह कारखाने के लिए एक अच्छी वाक्य रचनात्मक चीनी होगी। यदि आपके पास वास्तव में एक अद्भुत परिदृश्य है जहां इस तरह का पैटर्न उपयोगी होगा, तो मुझे एक उदाहरण देखना अच्छा लगेगा। –

+1

@Eric: जबकि यह विशेष रूप से सी # उदाहरण नहीं है, मैं एक ऐसी स्थिति में आया हूं जहां यह सी ++ में उपयोगी होगा। मैं एक क्रॉस-प्लेटफार्म लाइब्रेरी विकसित कर रहा हूं, और यह प्लेटफॉर्म-अज्ञेय एबीसी के लिए वास्तव में उपयोगी होगा ताकि वह अपने कन्स्ट्रक्टर से प्लेटफ़ॉर्म-विशिष्ट व्युत्पन्न क्लास इंस्टेंस लौटा सके। मुझे यकीन है कि सी # के साथ विकास करते समय ऐसी ही स्थितियां होनी चाहिए। – Mac

+0

@ एरिक लिपर्ट - मेरे पास आपके लिए असली दुनिया का परिदृश्य है! http://blog.hackensplat.com/2010/09/construct-something-else-c.html – billpg

उत्तर

4

यह संभव नहीं है।

चालाक कामकाज में बेसर के चारों ओर एक रैपर का उपयोग करके static फ़ंक्शन या (अनुशंसित नहीं) के साथ कन्स्ट्रक्टर को प्रतिस्थापित करना और विभिन्न लिपटे वर्ग बनाना शामिल है।

8

आप मापदंडों के आधार पर, एक कारखाने विधि के साथ निर्माता की जगह, और वापसी जो कुछ भी आप की तरह कर सकते हैं:

public Class2 : Class1 {} 

public static Class1 CreateClass1(bool returnDerivedClass) 
{ 
    if (returnDerivedClass) 
    { 
     return new Class2(); 
    } 
    else 
    { 
     return new Class1(); 
    } 
} 
0

इन आप फैक्टरी पैटर्न की जांच करना चाह जैसी चीजों के लिए। इसके अतिरिक्त, आपकी ज़रूरतों के आधार पर, मैं युग्मन को कम करने के लिए सामान्य तरीकों को देखने की अनुशंसा करता हूं। कक्षा के कन्स्ट्रक्टर को आपका कॉल सबसे कठिन युग्मन है जो आपके पास एक प्रोग्राम में हो सकता है और आपके द्वारा स्वयं को पता चला है कि कार्यान्वयन को परेशानी के रूप में बदलना।

"नियंत्रण में उलझन" और "निर्भरता इंजेक्शन" के बारे में पढ़ें, शायद यही वह है जिसे आप वास्तव में देखते हैं।

एक अच्छी लाइब्रेरी here मिल सकती है।

0

इंजेक्शन लाइब्रेरी का उपयोग करें। नीचे दिए गए लिंक वहाँ इंजेक्शन पुस्तकालयों में से एक महान सूची और उनके प्रदर्शन

http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison

मैं तथापि सुझाव है की तुलना कि प्रदर्शन शायद ही कभी एक मापदंड आप पर एक इंजेक्शन पुस्तकालय का चयन करेंगे है प्रस्तुत करता है, सबसे अनुप्रयोगों का दृष्टांत नहीं होता इस परीक्षण ने अपने परीक्षणों में उपयोग की जाने वाली वस्तुओं की संख्या। मैं एन इंजेक्ट का उपयोग कर रहा हूं जो नौकरी अच्छी तरह से करता है, हालांकि अगर मैं एक और प्रोजेक्ट शुरू करना चाहता हूं तो शायद मैं simpleinjector को एक बार दूंगा, ऐसा लगता है कि मैं एन इंजेक्शन में उपयोग की जाने वाली सभी सुविधाओं का अनुभव करता हूं और यह प्रदर्शन तुलना में अच्छा प्रदर्शन करता है।

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