ऑब्जेक्टिव-सी में, आप विधि नामों की घोषणा नहीं कर सकते हैं जहां अंतिम घटक एक तर्क नहीं लेता है। उदाहरण के लिए, निम्नलिखित अवैध है।
-(void)take:(id)theMoney andRun;
-(void)take:(id)yourMedicine andDontComplain;
ऑब्जेक्टिव-सी को इस तरह क्यों बनाया गया? क्या यह स्मॉलटाक की सिर्फ एक कलाकृति थी जिससे किसी को छुटकारा पाने की आवश्यकता नहीं थी?
यह सीमा स्मॉलटाक में समझ में आती है, क्योंकि स्मॉलटाक में मैसेज इनवोकेशन के आस-पास सीमांकक नहीं है, इसलिए अंतिम घटक को अंतिम तर्क के लिए एक असमान संदेश के रूप में व्याख्या किया जाएगा। उदाहरण के लिए, के BillyAndBobby take:'$100' andRun
रूप में पार्स किया जाएगा BillyAndBobby take:('$100' andRun)
। यह ऑब्जेक्टिव-सी में कोई फर्क नहीं पड़ता जहां स्क्वायर ब्रैकेट की आवश्यकता होती है।
पैरामीटर रहित चयनकर्ता घटकों का समर्थन करने से हमें उन सभी सामान्य तरीकों से ज्यादा फायदा नहीं होगा, जिस तरह से एक भाषा को मापा जाता है, क्योंकि विधि नाम एक प्रोग्रामर चुनता है (जैसे कि runWith:
बजायtake:andRun
) एक कार्यक्रम के कार्यात्मक शब्दार्थ को प्रभावित नहीं करता है, और न ही भाषा की अभिव्यक्ति। वास्तव में, पैरामीटर रहित घटकों वाला एक प्रोग्राम एक के बिना अल्फा के बराबर है। मैं इस तरह के जवाब में दिलचस्पी नहीं रखता हूं कि इस तरह की सुविधा आवश्यक नहीं है (जब तक कि ऑब्जेक्ट-सी-डिज़ाइनर्स के घोषित कारण नहीं थे, क्या ब्रैड कॉक्स या टॉम लव को जानने के लिए कोई होता है? क्या वे यहां हैं?) या यह कहें कैसे विधि नाम लिखने के लिए तो सुविधा की जरूरत नहीं है। प्राथमिक लाभ पठनीयता और लेखनीयता है (जो पठनीयता की तरह है, केवल ... आप जानते हैं), क्योंकि इसका मतलब है कि आप विधि के नाम लिख सकते हैं जो प्राकृतिक भाषा के वाक्यों से भी अधिक निकटता से मिलते जुलते हैं। की पसंद -(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication
(जो मैट गलाघेर "कोको विद लव" पर बताते हैं-(BOOL)application:(NSApplication*)theApplication shouldTerminateAfterLastWindowClosed
, इस प्रकार उपयुक्त संज्ञा के तुरंत बाद पैरामीटर रखना।
Apple के ऑब्जेक्टिव-सी रनटाइम (उदाहरण के लिए) इस तरह के चयनकर्ताओं को संभालने में पूरी तरह से सक्षम है, इसलिए कंपाइलर क्यों नहीं? क्यों न वे विधि नामों में भी उनका समर्थन करें?
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface Potrzebie : NSObject
-(void)take:(id)thing;
@end
@implementation Potrzebie
+(void)initialize {
SEL take_andRun = NSSelectorFromString(@"take:andRun");
IMP take_ = class_getMethodImplementation(self, @selector(take:));
if (take_) {
if (NO == class_addMethod(self, take_andRun, take_, "@@:@")) {
NSLog(@"Couldn't add selector '%@' to class %s.",
NSStringFromSelector(take_andRun),
class_getName(self));
}
} else {
NSLog(@"Couldn't find method 'take:'.");
}
}
-(void)take:(id)thing {
NSLog(@"-take: (actually %@) %@",NSStringFromSelector(_cmd), thing);
}
@end
int main() {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Potrzebie *axolotl=[[Potrzebie alloc] init];
[axolotl take:@"paradichloroaminobenzaldehyde"];
[axolotl performSelector:NSSelectorFromString(@"take:andRun")
withObject:@"$100"];
[axolotl release];
[pool release];
return 0;
}