उद्देश्य-सी गतिशील भाषा है। एक कार्यान्वयन क्या है, इसका विचार एक स्थिर भाषा से अलग है।
अधिकांश भाग के लिए, यह कोड में है कि हम में से अधिकांश @ कार्यान्वयन ... @end ब्लॉक के अंदर लागू होते हैं।
लेकिन यदि कोई विधि नहीं मिली तो क्या होगा? फिर किसी वस्तु के पास गतिशील रूप से इसका मौका होता है।
कल्पना कीजिए कि आप एक ध्वनि प्रभाव खिलाड़ी के लिए एक इंटरफेस है:
@protocol FX
- (void)playBeep;
- (void)playSiren;
- (void)playHonk;
@end
कार्यान्वयन फ़ाइलों Beep.mp3, Siren.mp3, हार्न हो सकता था।एमपी 3, लेकिन इसके बजाय तरीकों में से प्रत्येक को लागू करने के खेलने के लिए, यह -forwardInvocation रद्द कर सकते थे: और चयनकर्ता स्ट्रिंग, इस स्यूडोकोड की तरह कुछ पार्स:
NSString *selName = NSStringFromSelector([invocation selector]);
if ([selName startsWith:@"play"]) {
NSString filename = fileNameFromSelector(selName);
[self playSoundFileNamed:filename];
}
यह काल्पनिक लग सकता है, लेकिन एक बार आप का उपयोग शुरू भाषा की गतिशील विशेषताएं, आप अधिक से अधिक स्थानों को खोजना शुरू कर देंगे जहां यह समझ में आता है। और मतलब से मेरा मतलब है, क्या यह प्रयास लंबे समय तक मदद करता है?
उपर्युक्त मामले में, बस इंटरफ़ेस में एक-साउंड * विधि नाम जोड़ें, और एक उचित नामित ध्वनि फ़ाइल में ड्रॉप करें। यह सिर्फ काम करता है।
व्यक्तिगत प्रयोगों से एक और उदाहरण: कोर डेटा इकाइयों से अधिक प्राकृतिक तरीके से कैसे निपटें। मैं यह करना चाहता हूं: एनएसएआरएआरई * लोग = [व्यक्ति ढूंढेंअल्विथनाम जैसा: @ "बी%"]; भविष्यवाणियों के साथ मिलकर, अनुरोधों को लाने आदि के बजाय
लेकिन मैं कोड में विधि के हर क्रमपरिवर्तन को परिभाषित नहीं करना चाहता हूं।
अगर मैं एक एक्सएमएल बिल्डर बनाना चाहता हूं तो कैसे? मैं एक गतिशील दृष्टिकोण को देखता हूं। इसने ग्रोवी बिल्डर्स को अच्छी तरह से सेवा दी है (उदाहरण के लिए ग्रोवी/ग्रेल्स देखें)।
एक आखिरी उदाहरण: मेरे पास एक विशेषता प्रणाली है जहां मैं विधियों के समूहों के रूप में व्यवहार परिभाषित कर सकता हूं और मेरी वस्तुओं को इस व्यवहार को आत्मसात कर सकता हूं। इसलिए, जबकि कंपाइलर इंटरफ़ेस के लिए कार्यान्वयन नहीं देखता है, मेरी ऑब्जेक्ट के अनुरूप है, उद्देश्य-सी रनटाइम का उपयोग करके कार्यान्वयन को एक विशेषता वर्ग से इंजेक्शन दिया जाता है। मेरे द्वारा ऐसा क्यों किया जाएगा? मुझे बॉयलर प्लेट के कई प्रतिनिधि तरीके मिलते हैं, लेकिन साथ ही, प्रत्येक स्थिति के लिए एक एकल बेस क्लास पर्याप्त लचीला नहीं है। कोड नमूने से कट और पेस्ट करने के बजाय, मेरे 'नमूने' संकलित और दौड़ :) और किसी भी बदलाव विशेषता का उपयोग कर सभी परियोजनाओं में परिलक्षित होते हैं।
वास्तव में यह समझने के लिए कि यह सब आपके लिए क्यों उपलब्ध है, यह एक छोटे से पर्यावरण के साथ खेलना लायक है (फेरो या स्क्वाक खोजें)। यह वह जगह है जहां उद्देश्य-सी की जड़ें हैं।
और अंत में, को रोकने के लिए इन चेतावनियों:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wprotocol"
@implementation ... @end
#pragma clang diagnostic pop