2012-02-20 9 views
13

मैं कठिन समय को समझने के लिए बाध्यकारी उद्देश्य सी में बनाम गतिशील टाइपिंग कोई इस व्याख्या कर सकते हैं गतिशील के बीच अंतर क्या है कर रहा हूँ में बनाम गतिशील टाइपिंग बाध्यकारी गतिशील के बीच क्या अंतर है?उद्देश्य सी

+0

के संभावित डुप्लिकेट में मदद करता है [ऑब्जेक्टिव-सी का उपयोग करता है गतिशील बंधन है, लेकिन कैसे?] (Http://stackoverflow.com/questions/1697093/objective-c-uses-dynamic-binding-but -how) –

+1

@ रिचर्ड - असहमत। ओपी गतिशील बाध्यकारी और गतिशील टाइपिंग के बीच अंतर के बारे में पूछ रहा है। आपके द्वारा संदर्भित प्रश्न गतिशील टाइपिंग को बिल्कुल संबोधित नहीं करता है। – jlehr

उत्तर

27

Dynamic typing उद्देश्य-सी में इसका अर्थ है कि id के किसी ऑब्जेक्ट का वर्ग संकलित समय पर अज्ञात है, और ऑब्जेक्ट पर संदेश भेजे जाने पर रनटाइम पर इसकी खोज की जाती है। उदाहरण के लिए, निम्न कोड में, foo के वर्ग ज्ञात नहीं है जब तक हम संदेश componentsSeparatedByString: भेजने के लिए प्रयास करते हैं।

id foo = @"One Two Three"; 
NSArray *a = [foo componentsSeparatedByString:@" "]; 

तो id डेटा प्रकार उपयोग करने के बजाय हम निम्नलिखित किया था ...

NSString *foo = @"One Two Three"; 

... तो हम स्थिर टाइपिंग की बजाय गतिशील टाइपिंग का उपयोग किया था।

Dynamic binding मतलब यह है कि संकलक पता नहीं है कि कौन सी विधि कार्यान्वयन का चयन किया जाएगा; इसके बजाए जब संदेश भेजा जाता है तो विधि कार्यान्वयन रनटाइम पर देखा जाता है। यह मूल रूप से Polymorphism के साथ हमारी सहायता करता है। एक भिन्न तरीके से कार्यान्वयन लागू करता है, तो उदाहरण के लिए, foo बल्कि NSString का एक उदाहरण से NSArray का एक उदाहरण है में तो

[foo description] 

का परिणाम है।

6
गतिशील टाइपिंग साथ

आप प्रकार id के एक चर उस वस्तु की किसी भी प्रकार के स्टोर कर सकते हैं हो सकता है। गतिशील बंधन के साथ आप यह कर सकते हैं: id obj; [obj doWhatever]; और जब तक obj एक प्रकार है कि -(void)doWhatever यह काम करेंगे लागू करता है के रूप में।

2
एप्पल प्रलेखन

गतिशील

एक चर गतिशील टाइप किया जब वस्तु के प्रकार यह बताते हैं करने के लिए संकलन समय पर चेक नहीं किया गया है टाइपिंग से

। उद्देश्य-सी एक वैरिएबल का प्रतिनिधित्व करने के लिए आईडी डेटा प्रकार का उपयोग करता है जो यह निर्दिष्ट किए बिना ऑब्जेक्ट है कि यह किस प्रकार की ऑब्जेक्ट है। इसे गतिशील टाइपिंग के रूप में जाना जाता है।

गतिशील टाइपिंग स्थिर टाइपिंग, जिसमें प्रणाली स्पष्ट रूप से वर्ग एक वस्तु संकलन समय पर संबंधित है की पहचान करता है के विपरीत है। संकलन समय पर स्टेटिक प्रकार की जांच कठोर डेटा अखंडता सुनिश्चित कर सकती है, लेकिन उस अखंडता के बदले में, गतिशील टाइपिंग आपके प्रोग्राम को अधिक लचीलापन प्रदान करती है। और ऑब्जेक्ट आत्मनिरीक्षण के माध्यम से (उदाहरण के लिए, एक गतिशील रूप से टाइप किया गया, अज्ञात ऑब्जेक्ट पूछना कि इसकी कक्षा क्या है), आप अभी भी रनटाइम पर किसी ऑब्जेक्ट के प्रकार को सत्यापित कर सकते हैं और इस प्रकार किसी विशेष ऑपरेशन के लिए इसकी उपयुक्तता को सत्यापित कर सकते हैं।

निम्न उदाहरण वस्तुओं की एक विषम संग्रह का उपयोग कर गतिशील टाइपिंग दिखाता है:

NSArray *anArray = [NSArray arrayWithObjects:@"A string", [NSDecimalNumber zero], [NSDate date], nil]; 
NSInteger index; 
for (index = 0; index < 3; index++) { 
    id anObject = [anArray objectAtIndex:index]; 
    NSLog(@"Object at index %d is %@", index, [anObject description]); 
} 

वस्तु कार्यावधि में चर द्वारा की ओर इशारा किया जो संदेश आप इसे करने के लिए भेजने के लिए प्रतिक्रिया करने के लिए सक्षम होना चाहिए; अन्यथा, आपका प्रोग्राम अपवाद फेंकता है। लागू विधि का वास्तविक कार्यान्वयन गतिशील बाध्यकारी का उपयोग करके निर्धारित किया जाता है।

गतिशील बंधन

गतिशील बंधन विधि का निर्धारण किया जाता है क्रम में करने के बजाय संकलन समय पर लागू करने की। गतिशील बाध्यकारी को देर से बाध्यकारी भी कहा जाता है। उद्देश्य-सी में, सभी विधियों को रनटाइम पर गतिशील रूप से हल किया जाता है। निष्पादित सटीक कोड विधि विधि (चयनकर्ता) और प्राप्त करने वाली वस्तु दोनों द्वारा निर्धारित किया जाता है।

गतिशील बाध्यकारी polymorphism सक्षम बनाता है। उदाहरण के लिए, कुत्ते, एथलीट, और कंप्यूटर सिमुलेशन सहित वस्तुओं के संग्रह पर विचार करें। प्रत्येक वस्तु का एक रन विधि का अपना कार्यान्वयन होता है। निम्नलिखित कोड खंड में, वास्तविक कोड जिसे अभिव्यक्ति द्वारा निष्पादित किया जाना चाहिए [anObject run] रनटाइम पर निर्धारित किया जाता है। रनटाइम सिस्टम किसी ऑब्जेक्ट की कक्षा में जो भी हो, उसमें उपयुक्त विधि की पहचान करने के लिए चलने वाली विधि के लिए चयनकर्ता का उपयोग करता है।

NSArray *anArray = [NSArray arrayWithObjects:aDog, anAthlete, aComputerSimulation, nil]; 
id anObject = [anArray objectAtIndex:(random()/pow(2, 31)*3)]; 
[anObject run]; 
0

आप जावास्क्रिप्ट के साथ परिचित हैं, तो उद्देश्य सी में गतिशील टाइपिंग काफी क्या 'var' जावास्क्रिप्ट, जहां इस चर के वास्तविक प्रकार रन-टाइम में पता लगा लिया जाएगा में है के समान है और एक बार यह है सौंपा। इसे पुन: उपयोग और पुन: प्रयास किया जा सकता है जितनी बार आप पसंद करते हैं जो इसे उपयोग करने के लिए जोखिम भरा बनाता है यदि आप निष्पादन के समय आयोजित वस्तु के प्रकार को नहीं जानते हैं, जैसा कि आप 'अपरिचित चयनकर्ता' रन टाइम अपवादों के माध्यम से कर सकते हैं । उद्देश्य-सी में, सभी ऑब्जेक्ट्स टाइप आईडी के हैं और इसलिए डायनामिक टाइपिंग के लिए टाइप आईडी का एक चर इस्तेमाल किया जा सकता है।

ऑब्जेक्ट्स पर डायनामिक बाइंडिंग 'पॉलिमॉर्फिक' व्यवहार है जहां सही विधि को उस समय के ऑब्जेक्ट के आधार पर बुलाया जाता है जिसे इसे रन टाइम पर कहा जा रहा है।

मुझे आशा है कि