2009-03-13 83 views
23

बाध्यकारी समय दो प्रकार के बीच वर्गीकृत किया जा सकता है: स्थैतिक और गतिशील। स्थिर और गतिशील बाध्यकारी के बीच क्या अंतर है?स्थिर और गतिशील बाध्यकारी के बीच क्या अंतर है?

क्या आप इसे आगे बढ़ाने के लिए प्रत्येक का एक त्वरित उदाहरण दे सकते हैं?

+1

यदि यह होमवर्क है, तो आप अपने योजना बनाई प्रतिक्रिया की आलोचना के लिए पूछ रहा से बेहतर हो जाएगा; जवाब के लिए बिल्कुल नहीं। –

+2

@ डैनियल एल, मैंने इसे होमवर्क के रूप में चिह्नित किया। यह सीधे मेरे होमवर्क में सवाल नहीं है। मुझे चीजों का एक गुच्छा स्थिर या गतिशील के रूप में वर्गीकृत करना है और मैं अपने सिर में साफ़ करने की कोशिश कर रहा हूं जो इस प्रश्न के माध्यम से है। अगर लोग जवाब देना चाहते हैं तो वे करेंगे। – KingNestor

+0

@ किंगिंगस्टर: हाँ, मैंने देखा कि यह होमवर्क था;] मैं देखता हूं कि अब आपका क्या मतलब है। –

उत्तर

26

सबसे सामान्य शब्दों में, स्थिर बंधन मतलब यह है कि संदर्भ संकलन समय पर हल कर रहे हैं।

Animal a = new Animal(); 
a.Roar(); // The compiler can resolve this method call statically. 

गतिशील बंधन मतलब यह है कि संदर्भ रन टाइम पर हल कर रहे हैं।

public void MakeSomeNoise(object a) { 
    // Things happen... 
    ((Animal) a).Roar(); // You won't know if this works until runtime! 
} 
+1

सच नहीं है, अगर वस्तु = = नया पशु(); –

+0

सच है, हालांकि मुझे लगता है कि यह स्पष्ट था कि मैं सामान्य होने की कोशिश कर रहा था। मैंने इसे थोड़ा सा समायोजित किया। –

+3

आपका उत्तरार्द्ध उदाहरण अभी भी स्थिर बाध्यकारी है। टाइपकास्ट सफल हो सकता है या नहीं भी हो सकता है, लेकिन यदि टाइपकास्ट सफल होता है, भले ही 'रोअर' वर्चुअल विधि है, तो कोड 'Animal.Roar() 'से जुड़े स्थिर रूप से vtable स्लॉट से जुड़ा होगा। गतिशील बाध्यकारी केवल सी # में होती है जब या तो नए 'गतिशील' प्रकार का उपयोग करते हुए, या अन्यथा प्रतिबिंब (उदाहरण के लिए 'ए। गेट टाइप()। GetMethod ("Roar") का उपयोग करके। (ए, शून्य) ') का उपयोग करें। उत्तरार्द्ध किसी भी प्रकार के साथ काम करेगा जो 'रोअर' नामक एक पैरामीटर रहित विधि लागू करता है, और सबसे व्युत्पन्न कार्यान्वयन वापस लौटाता है (भले ही आधार कार्यान्वयन गैर-वर्चुअल है)। – supercat

6

यह तब निर्भर करता है जब बाध्यकारी होता है: संकलन समय (स्थैतिक) या रनटाइम (गतिशील) पर। जब आप एक साधारण वर्ग विधि कहते हैं तो स्टेटिक बाध्यकारी का उपयोग किया जाता है। जब आप कक्षा पदानुक्रमों और आभासी तरीकों से निपटना शुरू करते हैं, तो संकलक VTABLE एस का उपयोग शुरू कर देगा। उस समय संकलक को पता नहीं था कि कॉल करने के लिए वास्तव में कौन सी विधि है और इसे चलाने के लिए सही विधि को समझने के लिए रनटाइम तक इंतजार करना है (यह VTABLE के माध्यम से किया जाता है)। इसे गतिशील बाध्यकारी कहा जाता है।

अधिक जानकारी और संदर्भों के लिए Virtual tables पर विकिपीडिया लेख देखें।

-4

संकलन समय पर बाध्यकारी स्थिर बाध्यकारी है और रन टाइम पर बाध्यकारी गतिशील बाध्यकारी है। पॉइंटर के स्थिर बाध्यकारी डेटा प्रकार में कौन सा तरीका लागू होता है हल करता है। लेकिन गतिशील बाध्यकारी डेटा प्रकार में ऑब्जेक्ट हल करता है कि कौन सी विधि लागू की जाती है ।

-4

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

यह दो प्रकार

  1. एक Subprogram में प्रवेश पर हो सकता है।
  2. निष्पादन समय के दौरान मनमानी बिंदुओं पर।

संकलन समय बाध्यकारी: - (अनुवाद TIME) यह निम्न में से मिलकर बनता है।

  1. प्रोग्रामर द्वारा चुने गए बाध्यकारी।
  2. अनुवादक द्वारा चुने गए बाध्यकारी।
  3. लोडर द्वारा चुने गए बाध्यकारी।
1

मैं एक क्वारा उपयोगकर्ता "मोनिस यूसुफ" के इस संपूर्ण उत्तर में आया था। वह इसे पूरी तरह से समझाता है। मैं इसे दूसरों के लिए यहां डाल रहा हूं।

बाइंडिंग ज्यादातर पॉलिमॉर्फिज्म से संबंधित ऑब्जेक्ट उन्मुख प्रोग्रामिंग में एक अवधारणा है।

सबसे पहले, समझें कि पॉलीमोर्फिज्म है। किताबें कहती हैं कि इसका मतलब है "एक नाम और एकाधिक रूप"। सच है, लेकिन बहुत सार है। आइए हम वास्तविक जीवन उदाहरण लें।आप एक "डॉक्टर" के पास जाते हैं, एक डॉक्टर एक आंख विशेषज्ञ, ईएनटी विशेषज्ञ, न्यूरो-सर्जन, होम्योपैथ इत्यादि हो सकता है

यहां, एक "डॉक्टर" एक नाम है और इसमें कई प्रकार हो सकते हैं; प्रत्येक अपना काम कर रहा है। यह वास्तविक जीवन में बहुरूपता है।

फ़ंक्शन ओवरलोडिंग: यह अवधारणा स्टेटिक बाइंडिंग दर्शाती है। फ़ंक्शन ओवरलोडिंग को लगभग दो या दो से अधिक विधियों (फ़ंक्शंस) के रूप में परिभाषित किया जा सकता है, जिनमें एक ही नाम है लेकिन विभिन्न हस्ताक्षर (पैरामीटर की संख्या, पैरामीटर के प्रकार, differt रिटर्न प्रकारों सहित) को ओवरलोडेड विधियों (या फ़ंक्शंस) कहा जाता है।

मान लीजिए कि आपको आयत और मंडल के क्षेत्र की गणना करना है। नीचे कोड देखें: -

class CalculateArea { 

    private static final double PI = 3.14; 

    /* 
     Method to return area of a rectangle 
     Area of rectangle = length X width 
    */ 
    double Area(double length, double width) { 
     return (length * width); 
    } 

    /* 
     Method to return area of circle 
     Area of circle = π * r * r 
    */ 
    double Area(double radius) { 
     return PI * radius * radius; 
    } 
} 

उपरोक्त कोड में, विभिन्न पैरामीटर के साथ दो विधियां "क्षेत्र" हैं। यह परिदृश्य फ़ंक्शन ओवरलोडिंग के रूप में योग्यता प्राप्त करता है।

अब, वास्तविक प्रश्न पर आ रहा है: यह स्थिर बाध्यकारी कैसा है?

जब आप अपने कोड में उपर्युक्त कार्यों में से किसी एक को कॉल करते हैं, तो आपको अपने द्वारा पारित पैरामीटर निर्दिष्ट करना होगा।

  • डबल प्रकार [कौन सा दूसरा फोन करेगा की एकल पैरामीटर [एक आयत के हैं कौन सा पहली विधि कॉल करेंगे, गणना करने के लिए]

    • दो प्रकार पर दो के मापदंडों: इस परिदृश्य में, आप पारित या तो होगा विधि, एक सर्कल के क्षेत्र की गणना करने के लिए]

    चूंकि संकलित समय पर जावा कंपाइलर पता लगा सकता है, जो कॉल करने के लिए काम करता है, यह संकलन-समय (या स्टेटिक) बाध्यकारी है।

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

    class ParentClass { 
        int show() { 
         System.out.println("I am from parent class"); 
        } 
    } 
    
    class ChildClass extends ParentClass{ 
        int show() { 
         System.out.println("I am from child class"); 
        } 
    } 
    
    class SomeOtherClass { 
        public static void main (String[] s) { 
         ParentClass obj = new ChildClass(); 
         obj.show(); 
        } 
    } 
    

    उपरोक्त कोड में, विधि show() एक ही हस्ताक्षर (और नाम) के रूप अधिरोहित किया जा रहा है दोनों माता पिता और बच्चे कक्षाओं में मौजूद है।

    तीसरी कक्षा में, SomeOtherClass, ParentClass के संदर्भ संदर्भ (ओबीजे) चाइल्डक्लास का उद्देश्य रखता है। अगला, विधि show() को एक ही संदर्भ चर (obj) से बुलाया जाता है।

    फिर, वही प्रश्न: यह गतिशील बाध्यकारी कैसा है?

    संकलन समय पर, संकलक जांचता है कि संदर्भ चर प्रकार का है और यह जांचता है कि विधि इस श्रेणी में show() मौजूद है या नहीं। एक बार यह जांचने के बाद, संकलन सफल होता है।

    अब, जब प्रोग्राम रन होते हैं, तो यह देखता है कि ऑब्जेक्ट ChildClass है और इसलिए, यह ChildClass की show() विधि चलाता है। चूंकि यह निर्णय RUNTIME पर किया जाता है, इसे डायनामिक बाध्यकारी (या रन-टाइम पॉलीमोर्फिज्म) कहा जाता है।

    मूल जवाब के लिए Link

  • संबंधित मुद्दे