অবজেক্টিভ-সি তে, আপনি শেষের উপাদানটি আর্গুমেন্ট গ্রহণ করবেন না এমন পদ্ধতির নামগুলি ঘোষণা করতে পারবেন না। উদাহরণস্বরূপ, নিম্নলিখিতটি অবৈধ।
-(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
সুতরাং, যথাযথ বিশেষ্যটির সাথে সাথেই প্যারামিটারটি স্থাপন করা।
অ্যাপলের অবজেক্টিভ-সি রানটাইম (উদাহরণস্বরূপ) এই ধরণের নির্বাচককে পরিচালনা করতে পুরোপুরি সক্ষম, তাই সংকলক কেন নয়? তাদের পাশাপাশি পদ্ধতির নামে সমর্থন করবেন না কেন?
#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;
}