जवाबों:
सही, वस्तुनिष्ठ-सी विधि अधिभार का समर्थन नहीं करता है, इसलिए आपको विभिन्न विधि नामों का उपयोग करना होगा।
ध्यान दें, हालांकि, "विधि नाम" में विधि हस्ताक्षर कीवर्ड (":" s) से पहले आने वाले पैरामीटर नाम शामिल हैं, इसलिए निम्न दो अलग-अलग विधियां हैं, भले ही वे दोनों "राइटटॉयफाइल" शुरू करते हैं:
-(void) writeToFile:(NSString *)path fromInt:(int)anInt;
-(void) writeToFile:(NSString *)path fromString:(NSString *)aString;
(दो विधियों के नाम हैं "writeToFile: fromInt:" और "writeToFile: fromString:")।
यह ध्यान देने योग्य हो सकता है कि भले ही ऑब्जेक्टिव-सी ओवरलोडिंग के तरीके का समर्थन नहीं करता हो, क्लैंग + एलएलवीएम सी के लिए फ़ंक्शन ओवरलोडिंग का समर्थन करता है । हालांकि आप जो खोज रहे हैं वह काफी नहीं है, यह कुछ स्थितियों में उपयोगी साबित हो सकता है (उदाहरण के लिए, जब को लागू करने में एक से थोड़ा काट दिया (कैप्सूलीकरण के खिलाफ जाता है) संस्करण के आगंतुक डिज़ाइन पैटर्न )
यहाँ एक सरल उदाहरण है कि कैसे कार्य ओवरलोडिंग कार्य करता है:
__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:
, हालांकि, एक अलग कहानी है ...
id
और isKindOfClass:
अधिकांश व्यावहारिक परिदृश्यों को कवर करता हूं । एक कारण जिसे आप ओवरलोडिंग पसंद कर सकते हैं, वह सबसे विशिष्ट प्रकार का स्वचालित चयन है, जो स्पष्ट प्रकार की जाँच के साथ बनाए रखने के लिए एक छोटे ओवरहेड को उकसाएगा।
डेविड इस पद्धति में सही है कि उद्देश्य-सी में ओवरलोडिंग का समर्थन नहीं किया गया है। यह उस अर्थ में 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