ऑब्जेक्टिव-सी में ओवरलोडिंग का तरीका?


131

जहाँ तक मेरी जानकारी है, ऑब्जेक्टिव-सी, ओवरलोडिंग के तरीके का समर्थन नहीं करता है। ऑब्जेक्टिव-सी में इसके लिए क्या विकल्प हो सकता है? या मुझे हमेशा अलग-अलग विधि नाम का उपयोग करना चाहिए?

जवाबों:


193

सही, वस्तुनिष्ठ-सी विधि अधिभार का समर्थन नहीं करता है, इसलिए आपको विभिन्न विधि नामों का उपयोग करना होगा।

ध्यान दें, हालांकि, "विधि नाम" में विधि हस्ताक्षर कीवर्ड (":" s) से पहले आने वाले पैरामीटर नाम शामिल हैं, इसलिए निम्न दो अलग-अलग विधियां हैं, भले ही वे दोनों "राइटटॉयफाइल" शुरू करते हैं:

-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;

(दो विधियों के नाम हैं "writeToFile: fromInt:" और "writeToFile: fromString:")।


4
@RaheelSadiq यह ओवरलोडिंग नहीं है क्योंकि विधि के नाम (ObjC: 'चयनकर्ताओं') में भिन्न हैं। अलग होने के कारण, न तो किसी को 'अतिभारित' माना जाता है। अगर राइट टू फाइल: से: दो बार परिभाषित किया गया है, केवल पैरामीटर प्रकार अलग हैं, तो यह ओवरलोडिंग होगा। जैसा कि कहा गया है, यह ओबजेक में समर्थित नहीं है, क्योंकि यह जावा और अब स्विफ्ट सहित अन्य भाषाओं के साथ है।
क्रिस हैटन

न केवल पैरामीटर खुद को नाम देता है, बल्कि यहां तक ​​कि कॉलोन विधि नाम का हिस्सा हैं, ताकि - (शून्य) राइटटॉयल: (एनएसएसटीरिंग *) पथ: (इंट) अनींत; और - (शून्य) राइटटॉयल: (एनएसएसट्रिंग ) पथ: ( एनएसएसटीरिंग) एस्ट्रिंग; और भी अलग-अलग विधियां हैं।
कैसरलुडी 11

22

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

यहाँ एक सरल उदाहरण है कि कैसे कार्य ओवरलोडिंग कार्य करता है:

__attribute__((overloadable)) float area(Circle * this)
{
    return M_PI*this.radius*this.radius;
}

__attribute__((overloadable)) float area(Rectangle * this)
{
    return this.w*this.h;
}

//...
//In your Obj-C methods you can call:
NSLog(@"%f %f", area(rect), area(circle));

किसी को लगता है कि यह संकेत, विधि स्विज़लिंग के साथ मिलकर, वास्तव में "अतिभारनीय" तरीकों को जन्म दे सकता है ... किसी को निपटान के साथ idऔर साथ में क्यों की आवश्यकता होगी isKindOfClass:, हालांकि, एक अलग कहानी है ...
एलेक्स ग्रे

1
@alexgray मैं आपकी बात देखता हूं, idऔर isKindOfClass:अधिकांश व्यावहारिक परिदृश्यों को कवर करता हूं । एक कारण जिसे आप ओवरलोडिंग पसंद कर सकते हैं, वह सबसे विशिष्ट प्रकार का स्वचालित चयन है, जो स्पष्ट प्रकार की जाँच के साथ बनाए रखने के लिए एक छोटे ओवरहेड को उकसाएगा।
क्रिस हटन

1
क्लैंग डॉक्यूमेंटेशन स्पष्ट रूप से कहता है कि यह क्या करता है। सी + + नाम सी। के लिए प्रबंधन प्रदान करता है और यह मूल रूप से संकलक स्वचालित रूप से पर्दे के पीछे कर रहा है जो कोई व्यक्ति ऑब्जेक्टिव-सी में उन तरीकों को नाम देता है जो शामिल हैं जो अलग-अलग होते हैं (लंबे रूप में) तर्क प्रकार।
क्रिस स्ट्रैटन

19

डेविड इस पद्धति में सही है कि उद्देश्य-सी में ओवरलोडिंग का समर्थन नहीं किया गया है। यह उस अर्थ में PHP के समान है। जैसा कि वह यह भी बताते हैं, दो या दो से अधिक विधियों को विभिन्न हस्ताक्षरों के साथ परिभाषित करना आम बात है। हालांकि, "आईडी" प्रकार का उपयोग करके एक विधि बनाना भी संभव है। "आईडी" प्रकार के माध्यम से, आप किसी भी ऑब्जेक्ट (और NSNumber वर्ग का उपयोग करके किसी भी आदिम) विधि को भेज सकते हैं और फिर विधि के भीतर से ही आप इसके प्रकार का परीक्षण कर सकते हैं और यदि आवश्यक हो तो उचित अपवाद फेंक सकते हैं। यद्यपि इसमें एक मामूली प्रदर्शन हिट है, यह तब तक नाममात्र या महत्वहीन होगा जब तक कि आप बड़ी मात्रा में डेटा संसाधित नहीं कर रहे हैं।

- (void) writeToFile: (NSString *)path fromObject: (id)object {
    if (!([object isKindOfClass: [NSNumber class]] || [object isKindOfClass: [NSString class]])) {
         @throw [NSException exceptionWithName: @"InvalidArgumentException" reason: @"Unrecognized parameter type." userInfo: nil];
    }
}

यह ऑब्जेक्ट प्रकार को लागू करने के लिए एक प्रोटोकॉल को लागू करने के लिए एक सुंदर स्थान भी है, जिसे इस प्रकार किया जा सकता है:

(id<MyProtocol>)object
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.