2010-11-26 5 views
13

में एकाधिक इंटरफेस निर्दिष्ट करने का तरीका मेरे पास दो इंटरफेस हैं, HasClickHandlers और DoesFancyFeedback। तब मेरे पास कुछ यूआई ऑब्जेक्ट्स हैं जो दोनों इंटरफेस को कार्यान्वित करती हैं - उदाहरण के लिए, Button जो लागू करता है दोनों पर क्लिक हैंडलर हैं और फैंसी फीडबैक भी करते हैं।जावा

मेरी कोड में हुए घोषणा की कि है Button रों, मैं वास्तव में Button कहने के लिए है, क्योंकि हो सकता है बाद मैं इसे होना चाहता हूँ, चाहता हूँ, मुझे पता नहीं एक Image संचालकों क्लिक है और फैंसी प्रतिक्रिया करता है। तो बजाय विशिष्ट जा रहा है और जैसे कुछ कहने का:

Button saveButton = aButtonIPassedIn; 
saveButton.addClickHandler(); 
saveButton.doFancyFeedback(); 

मैं कहना चाहता हूँ,

{HasClickHandlers + DoesFancyFeedback} clickyFeedbackThing = aThingIPassedIn; 
clickyFeedbackThing.addClickHandler(); 
clickyFeedbackThing.doFancyFeedback(); 

मैं संकलक की आवश्यकता होती है कि aThingIPassedIn दोनों HasClickHandlersऔरDoesFancyFeedback को लागू करना चाहते हैं।

मैं एक इंटरफ़ेस बना सकता हूं जो उन दो इंटरफेस को बढ़ाता है, और इसका उपयोग करता है। क्या कोई आसान/कम वर्बोज़ तरीका है?

+0

आप सैद्धांतिक रूप से जेनेरिक के साथ ऐसा कर सकते हैं, मुझे लगता है - तर्क पर एक बाधा डालें कि इसे दोनों इंटरफेस को लागू करना होगा। हालांकि यह थोड़ी देर के बाद से मैंने जावा जेनरिक का उपयोग किया है, इसलिए मेरी याददाश्त .NET जेनेरिक द्वारा थोड़ी सी दिक्कत हो सकती है। – cdhowie

+1

किसी भी विशिष्टता (एचए) को पूरा करने के तरीके पर यह बहुत अच्छा होगा! –

उत्तर

26

मुझे नहीं लगता कि आप जो चाहते हैं उसे करने का एक बेहतर तरीका है। मैं आपको निम्नलिखित करने के लिए सुझाव देना चाहता था।

<T extends HasClickHandlers & DoesFancyFeedback> void foo(T arg); 

कृपया 2 अपने इंटरफेस के बीच एक एम्परसेंड पर ध्यान देना: आप विधि (यह foo कॉल) है कि तर्क है कि 2 इंटरफेस की आवश्यकता को स्वीकार करता है बना सकते हैं।

+0

वाह, कौन जानता था !? इसके बाद, हमेशा 'हैस' को 'हैस्क्लिक हैंडलर' या 'डेंफेंसीफिडबैक' में डालना सुरक्षित होगा, है ना? इंटरफेस के हर संयोजन के लिए एक समग्र इंटरफ़ेस बनाने से यह आसान तरीका होगा जो मैं कभी चाहूंगा। –

+2

@Riley: आपको इसे इस मामले में डालना नहीं है, बस उस पर विधियों को कॉल करें। – thejh

+0

आह, ज़ाहिर है। यह भी खूब रही! –

1

नहीं, जावा में ऐसी कोई चीज़ नहीं है।

आपको तीसरे इंटरफ़ेस बनाने का उल्लेख करने वाले विकल्प का उपयोग करना होगा। इस तरह आप स्पष्ट रूप से एक नए प्रकार का उपयोग करने के अपने इरादे की घोषणा करेंगे।

public interface FancyWithHandler 
     extends HashClickHandlers , DoesFancyFeedback {} 

आप तरीकों में शामिल करने की जरूरत नहीं:

क्योंकि आप बस टाइप करेंगे, वह सब (वैकल्पिक पर विचार) के बाद वर्बोज़ नहीं है। और फिर बस इसे का उपयोग करें:

FancyWithHandler clickyFeedbackThing = aThingIPassedIn; 
clickyFeedbackThing.addClickHandler(); 
clickyFeedbackThing.doFancyFeedback();  

जबकि सामान्य विकल्प दिलचस्प लग रहा है, शायद अंत में आप को एक बहुत अधिक वर्बोज़ बात बनाने समाप्त कर देंगे।

+0

ओपी ने कहा: "मैं एक इंटरफ़ेस बना सकता हूं जो उन दो इंटरफेस को बढ़ाता है, और इसका उपयोग करता है। क्या कोई आसान/कम वर्बोज़ तरीका है?" – thejh

+0

मुझे उस हिस्से को याद आती है, मैंने अपना जवाब बदल दिया है। – OscarRyz

5

आप जेनरिक उपयोग करने का प्रयास हो सकता है:

public < T extends HashClickHandlers & DoesFancyFeedback > void foo (
     T aThingIPassedIn 
    ) 
{ 
    aThingIPassedIn.addClickHandler(); 
    aThingIPassedIn.doFancyFeedback(); 
} 
+1

पैरामीटर घोषित करने का एक शानदार तरीका - क्या इस तरह कोई फ़ील्ड या अन्य चर घोषित करने का कोई तरीका है? –

0

हालांकि कि बदसूरत हो सकता है, आप propably यह एक वस्तु बनाने के लिए और यह डाली सकता है। कॉलिंग विधि के लिए, यह सबसे आसान तरीका होगा।

-1

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

+0

आप 'हैस्क्लिक हैंडलर' को लागू करने के लिए बटन नहीं चाहते हैं? यह प्रसंस्करण नहीं कर रहा है, यह उपयोगकर्ता इंटरफ़ेस है - इस मामले में 'DoFancyFeedback' "बटन टेक्स्ट के बगल में एक घुमावदार लोडिंग आइकन दिखाएं," और' हैस्क्लिक हैंडलर 'है "जब उपयोगकर्ता इस बटन पर क्लिक करता है तो मुझे बताएं।" आखिरकार, आप जिस श्रोता को प्रस्तावित करते हैं, वह बटन से नहीं जुड़ा होगा? –

+1

HasClickHandlers क्या कर रहा है? यह इंगित करने के लिए कि क्या कुछ पंजीकृत है या नहीं, बस एक सच/झूठा? – duffymo