2010-01-30 12 views
6

मैं अपने उप-वर्ग के अनुसार विधि को अलग करने के लिए वस्तुओं को प्रेषित करने की कोशिश कर रहा हूं।सबक्लास प्रकार के आधार पर जावा विधि कैसे शुरू करें?

उदाहरण के लिए,, उन 2 वस्तुओं

class A extends I {} 
class B extends I {} 

और विधि

void dispatch(I i) {} 
dispatch() में

पर विचार मैं i के प्रकार के अनुसार एक विधि आह्वान करने के लिए करना चाहते हैं। इसलिए यदि i वास्तव में टाइप ए का है, handlerA(A a) विधि कहा जाएगा। यदि यह प्रकार बी, handlerB(B b) कहलाता है, और इसी तरह ... मैंने विधि अधिभार के साथ प्रयास किया लेकिन मुझे लगता है कि यह इस तरह से काम नहीं करता है

इसे प्राप्त करने का सबसे अच्छा तरीका क्या है? मैं अगर/बाकी कथन का उपयोग से बचना चाहते हैं ...

अग्रिम धन्यवाद,

संपादित करें: मैं उन वर्गों के किसी भी संशोधित नहीं कर सकते।

उत्तर

3

तो I में आप handler() प्रणाली की घोषणा, और यह उचित रूप से लागू करने (अर्थात अलग ढंग से) A और B दोनों में।

इस बहुरूपता :)

+0

मतलब यह है कि 'हैंडलर()' समझ में आता है 'A' और' b' पर लिख सकते हैं। यदि ऐसा है, तो आपका जवाब 100% सही है। –

+0

केविन: आप सही हैं, यह करता है। लेकिन केवल एक तरह का। मुझे अभी भी लगता ओपी बहुरूपता के बुनियादी विचार की याद आ रही है, और यहां तक ​​कि अगर मेरे सटीक सुझाव उपयुक्त नहीं है, मुझे लगता है कि में एक समारोह/संपत्ति में से कुछ योजना 'मैं' घ जाने का रास्ता है। –

+0

अगर हैंडलर() मैं में है, और दोनों ए और बी मैं लागू है, लेकिन यह मतलब नहीं है हैंडलर के लिए() दोनों पर, मुझे लगता है कि ** शायद ** अन्य समस्याएं हैं। – Carl

2

उपयोग Visitor Pattern है।

संक्षेप में, I एक accept(Visitor<T> ...) प्रणाली की घोषणा, और Visitor बेनकाब onA(A ...), onB(B ...), आदि तरीकों है। I इंटरफ़ेस के आपके कार्यान्वयन Visitor<T> में पारित उचित विधि को कॉल करेंगे।

यह संभवतः इसके लायक नहीं है (बॉयलरप्लेट के कारण) यदि आपके पास केवल 2 ठोस वर्ग हैं, लेकिन कहीं 3 या 4 के आसपास यह इसके लायक होने लगते हैं - अगर केवल डुप्लीकेट से बचने के लिए यदि अन्यथा संरचनाएं हैं।

1

अपने संपादित के बाद से, मुझे लगता है आप ए, बी और मैं संपादित नहीं कर सकते; इस बुरी खबर की ओर जाता है:

आप वारिस कर सकते हैं A से कहना C इस वर्ग (सी) आप super.dispatch() कॉल कर सकते हैं ताकि आप आधार वर्ग A.dispatch() तक पहुँच सकते हैं में।

  • लेकिन डिजाइन (उपेक्षित विरासत) की वजह से आप I नहीं पहुँच सकते हैं। यह super.super को कॉल करने की तरह होगा, जिसकी अनुमति नहीं है

  • जावा में, आप सुपर() सुपर() को कॉल नहीं कर सकते हैं। चाइल्ड्स अपने माता-पिता के पास है, लेकिन उनके दादा दादी से नहीं।

तो आप खराब डिजाइन का शिकार हैं। संपादित करें: तय टाइपो

0

एक ही तरीका है आप कर सकते हैं इस प्रकार की जाँच का उपयोग है ऐसा लगता है। मैं समझता हूं कि इसे प्रोत्साहित नहीं किया जाना चाहिए, लेकिन ...

void dispatch(I i) 
{ 
    if(i instanceof A) 
    { 
     handlerA(); 
    } 
    else 
    { 
     handlerB(); 
    } 
} 

लेकिन गंभीरता से, यदि आप इसे से बच सकते हैं, तो इस तरह कोड न लिखें। आप उन्हें संशोधित नहीं कर सकते हैं, तो आप किसी भी संयोग से ए और बी, एक अलग हैंडलर में दोनों के लिए() विधि जोड़ सकते हैं और विस्तार करने और ए और बी के बजाय इन नए उपवर्गों इस्तेमाल कर सकते हैं?

0

मुझे लगता है कि Adapter Pattern इस मामले में आगंतुक पैटर्न की तुलना में अधिक लागू है।

+0

वास्तव में कैसे? (15) – Bozho

0

आप स्काला इस्तेमाल कर सकते हैं, तो आप

i match { 
    case a: A => handlerA(a) 
    case b: B => handlerB(b) 
    case _ => throw new Exception("Unknown i: " + i.toString) 
} 
संबंधित मुद्दे