2011-01-26 13 views
16

में ओवरलोडेड विधियां आज के लिए मेरा प्रश्न: इंटरफ़ेस में ओवरलोडेड विधियां खराब हैं? आप जानते हैं, "यदि आप परवाह नहीं करते हैं तो" ओमिट पैरामीटर, हम डिफ़ॉल्ट मानों को समझेंगे "ओवरलोडेड विधियों की तरह। कि जैसा:इंटरफ़ेस

void Add(object item); 
void Add(object item, bool shouldDoSomething); 
void Add(object item, bool shouldDoSomething, IUltraObscureDeviceContext context); 

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

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

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

+0

यदि आप जिस अनुबंध को आपूर्ति कर रहे हैं, इस विधि के 3 संस्करण पेश करने का वादा करता है, तो आपको उन अधिभारों को शामिल करना चाहिए। –

+0

खैर, हाँ, मुझे पता है, लेकिन इस तरह के सवाल में भी शामिल है - क्या मुझे अनुबंधों की आपूर्ति करनी चाहिए या नहीं या कभी-कभी या शायद – Dyppl

+0

हम ** डिफ़ॉल्ट पैरामीटर ** का उपयोग क्यों नहीं कर रहे हैं? –

उत्तर

8

यदि डिफ़ॉल्ट विधि कॉल के प्राप्तकर्ता पर निर्भर करता है, तो उन्हें इंटरफ़ेस विधियों के रूप में घोषित करें।

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

आप बुनियादी तथ्य 80/20 नियम अपवाद है, जहां कार्यान्वयन स्वतंत्र चूक कर रहे हैं किसी प्रकार के साथ काम कर रहे हैं लगभग लेकिन काफी नहीं हमेशा पर्याप्त है, तो आप कुछ ही विकल्प हैं, जिनमें से कोई भी कर रहे हैं कि अच्छा:

  • इसके साथ सौदा करें जैसे कि वे हमेशा अलग होते हैं, उन्हें इंटरफ़ेस विधियों के रूप में घोषित करते हैं, और उन्हें हर जगह पुन: कार्यान्वित करते हैं। बहुत शुष्क नहीं है।
  • इसके साथ सौदा करें जैसे कि वे हमेशा अलग होते हैं, उन्हें इंटरफ़ेस विधियों के रूप में घोषित करते हैं, और बेस क्लास का उत्तराधिकारी करते हैं जो 80% डिफ़ॉल्ट कार्यान्वयन प्रदान करता है। बेकार की तरह, और अच्छा नहीं है अगर आपका एकमात्र बेस-स्लॉट स्लॉट पहले से ही कब्जा कर लिया गया है।
  • उन विशिष्ट तरीकों वाले एक और इंटरफ़ेस बनाएं। मूल इंटरफेस के खिलाफ मिलान हस्ताक्षर के साथ विस्तार विधियों की घोषणा करें। विस्तार विधियों में, as- this नए इंटरफ़ेस प्रकार के लिए तर्क, और यदि यह मेल खाता है, तो उसे वहां कॉल करें, अन्यथा स्टॉक डिफ़ॉल्ट को भरें। बहुत ही मज़ेदार, गतिशील कास्टिंग पर निर्भर है, जो कि आंतरिक लूप में बहुत अच्छा नहीं है, लेकिन यह कार्यान्वयनकर्ताओं के लिए लचीलापन बलिदान किए बिना कार्यान्वयनकर्ता और कॉलर दोनों के डिफ़ॉल्ट को अस्वीकार करता है जो "डिफ़ॉल्ट डिफ़ॉल्ट" नहीं ले सकते हैं।
+0

अंतिम विकल्प वास्तव में बहुत ही मजेदार है, लेकिन एक बुरी समस्या के लिए एक अच्छा समाधान की तरह लगता है। कुल मिलाकर ठोस जवाब, धन्यवाद। – Dyppl

+0

इंटरफ़ेस होने के बारे में एक बिटमैस्क-एनम पैरामीटर शामिल है जो इंगित करता है कि कौन से अन्य पैरामीटर निर्दिष्ट हैं, और कार्यान्वयन-स्वतंत्र रैपर अतिरिक्त पैरामीटर में उचित मानों के साथ "असली" दिनचर्या कहते हैं? अगर मेरे ड्रूटर थे, तो स्वचालित रूप से ऐसा करने का एक तरीका होगा, लेकिन स्वचालित तंत्र के बिना भी यह एक अच्छा दृष्टिकोण हो सकता है। – supercat

0

आईएमओ अगर इंटरफ़ेस/अनुबंध इसे फैलाता है, तो कोई समस्या नहीं होनी चाहिए। हालांकि लक्ष्य इंटरफ़ेस को उजागर करते समय और विवरण छुपाते समय चीजों को सरल बनाना है। और जहां वैकल्पिक पैराम काम में आते हैं। पाइथन जैसे प्रभावी रूप से ऑब्जेक्ट उन्मुख ऑब्जेक्ट्स को ओवरलोडिंग भी नहीं किया जाता है AFAIK

+0

ऑब्जेक्टिव-सी जैसी अन्य पूरी तरह से पर्याप्त ऑब्जेक्ट-उन्मुख भाषाओं में इंटरफेस नहीं हैं (ओबीजेसी में प्रोटोकॉल हैं जो कुछ हद तक संबंधित हैं) जो इस सवाल को भी हल करेंगे। –

1

इंटरफ़ेस में ओवरलोडेड विधियां शायद ठीक है अगर इंटरफ़ेस का डिज़ाइन इसे वारंट करता है। मुझे व्यक्तिगत रूप से ऐसा करने की आवश्यकता नहीं है।

मैं एक इंटरफेस में डिफ़ॉल्ट पैरामीटर मान परिभाषित नहीं करता। यह एक कार्यान्वयन विस्तार है जो सतहों को चुनने वाली कक्षाओं को लागू करता है।

आप ओवरलोड के लिए अलग-अलग कार्यान्वयन के बारे में टिप्पणी करते हैं ....

ऐसा मत करो। इन अधिभारित विधियों के कार्यान्वयन के बारे में सोचें क्योंकि एक विधि को कॉल करना जिसमें कुछ डिफ़ॉल्ट मानों के साथ परिभाषित सभी पैरामीटर हैं। इस प्रकार आपके कोड के उपयोगकर्ता चीजों की अपेक्षा करेंगे।

यदि आपको विभिन्न व्यवहार की आवश्यकता है तो पॉलिमॉर्फिज्म का उपयोग करें। इसके लिए यही है।

+0

पॉलिमॉर्फिज्म आपको एक उदाहरण में दो कार्यान्वयन नहीं देगा। मुझे लगता है कि – Dyppl

+0

के लिए अलग-अलग नामों के साथ विधियां हैं, अप्रत्यक्ष रूप से मैं यह कह रहा था कि कार्यान्वयन वर्ग अलग होना चाहिए और चीजों को अलग-अलग ओवरलोड को अलग-अलग लागू करने के बजाय चीजों को मिश्रण नहीं करना चाहिए, बल्कि इसके बजाय बहुरूपता का उपयोग करना चाहिए। –

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