बनाने के लिए मैं टैग किए गए वर्गों का उपयोग करने से बचाना चाहता हूं और बड़ा अगर अन्य ब्लॉक या स्विच स्टेटमेंट और क्लास पदानुक्रम के साथ बहुरूपता का उपयोग करना चाहता हूं, जो मुझे विश्वास है कि बेहतर अभ्यास है।ऑब्जेक्ट्स और पॉलीमोर्फिज्म
उदाहरण के लिए, नीचे की तरह कुछ, जहां निष्पादित विधि की पसंद एक प्रकार के ऑब्जेक्ट के ऑब्जेक्ट का केवल एक फ़ील्ड निर्भर है।
switch(actor.getTagField())
{
case 1: actor.act1(); break;
case 2: actor.act2(); break;
[...]
}
actor.act();
बन जाएगा और कार्य विधि अभिनेता के उपवर्गों में अधिरोहित किया जाएगा।
हालांकि, क्रम जो उपवर्ग का दृष्टांत के लिए कम से तय करने के लिए सबसे स्पष्ट रास्ता बहुत मूल के समान दिखता है:
तो यह कुछ भी नहीं की तरह लगता हैActor newActor(int type)
{
switch(type)
{
case 1: return new Actor1();
case 2: return new Actor2();
[...]
}
}
वास्तव में प्राप्त किया गया है; तर्क अभी ले जाया गया है।
ऐसा करने का बेहतर तरीका क्या है? अभिनेता के प्रत्येक उप-वर्ग के लिए फैक्ट्री क्लास को लागू करने में शामिल होने का एकमात्र तरीका है, लेकिन यह इतनी सरल समस्या के लिए बोझिल लगता है।
क्या मैं इस पर विचार कर रहा हूं? ऐसा लगता है कि मूल परिवर्तन करने का कोई मतलब नहीं है अगर मैं कहीं और भी वही चीज़ करता हूं।
क्षमा करें, स्पष्टीकरण के लिए, मैं चुनना चाहता हूं कि कौन सा सबक्लास रनटाइम पर तत्काल चालू हो, न कि आपके उदाहरण के रूप में संकलित समय पर। इसके लिए एक बड़ा स्विच या अगर-अन्य ब्लॉक की आवश्यकता होती है, जिसे मैं टालना चाहता था। मुझे लगता है कि यह जरूरी नहीं है क्योंकि इसे सृजन में केवल एक बार जरूरी है। – flowsnake
हम्म ... वास्तव में कारखाने के पास एक्टर्स के निर्माण की ज़िम्मेदारी और नियंत्रण के बजाय, रनटाइम इंस्टेंटेशन बनाम डब्ल्यू/संकलन करने के लिए बहुत कुछ नहीं है। उदाहरण के लिए यदि अभिनेताओं का उपरोक्त निर्माण एक घटना में हुआ, तो क्या यह रनटाइम नहीं होगा? –
आप जो कर रहे हैं वह अभिनेताओं के निर्माण को केंद्रीकृत करने के लिए "निर्णय लेना" है। आप चाहते हैं कि अभिनेता एक ही स्थान से आ रहे हों, इस मामले में .. आप स्विचिंग के आसपास नहीं जा सकते ... क्योंकि यह एक निर्णय है अंतिम उपयोगकर्ता। –