मैं जावा में एक वर्ग पदानुक्रम है मान लीजिए:डिज़ाइन पैटर्न पैटर्न?
interface Item { ... };
class MusicBox implements Item { ... };
class TypeWriter implements Item { ... };
class SoccerBall implements Item { ... };
और मैं एक ही पैकेज में एक और वर्ग है:
class SpecialItemProcessor {
public void add(Item item)
{
/* X */
}
}
जहां मैं कुछ प्रत्येक आइटम प्रकार के लिए अलग करना चाहते हैं, लेकिन मैं डॉन अलग-अलग Item
कक्षाओं (MusicBox
, TypeWriter
, SoccerBall
) में उस क्रिया को परिभाषित नहीं करना चाहते हैं।
एक तरीका यह संभाल करने के लिए है:
class SpecialItemProcessor {
public void add(Item item)
{
if (item instanceof MusicBox)
{
MusicBox musicbox = (MusicBox)item;
... do something ...
}
else if (item instanceof MusicBox)
{
TypeWriter typewriter = (TypeWriter)item;
... do something ...
}
else if (item instanceof SoccerBall)
{
SoccerBall soccerball = (SoccerBall)item;
... do something ...
}
else
{
... do something by default ...
}
}
}
यह काम करता है लेकिन यह वास्तव में भद्दा लगता है। क्या मुझे ऐसा करने का बेहतर तरीका है, जब मुझे विशेष मामलों के बारे में पता है? (जाहिर है, अगर Item
एक विधि शामिल doSomethingSpecial
तो मैं सिर्फ इतना है कि आइटम की विधि यह क्या टाइप कर रहा है देखभाल के बिना कॉल कर सकते हैं, लेकिन स्वयं आइटम मैं इसे से कैसे निपटते हैं के भीतर होने के लिए है कि भेदभाव चलेगा कि मैं नहीं चाहता?)
मुझे कोई जवाब नहीं है, लेकिन एक्शनस्क्रिप्ट 3 में जाहिर है कि आप एक स्ट्रिंग से कक्षा को तुरंत चालू कर सकते हैं (यानी 'com.djw.MusicBox' एक संगीत बॉक्स को चालू कर सकता है), है जावा में शायद इस तरह की चीज संभव है? केवल एक सलाह! – danjah
@ डैन: 'कक्षा # नामनाम()'। हालांकि मैं यहां मूल्य पर सवाल करता हूं। – BalusC