2011-09-24 17 views
5

जब मैं स्प्राइट फैलाता हूं तो मैं हमेशा सुपर() को कॉल नहीं करता हूं।
लेकिन not calling super() कोई समस्या नहीं है?

अभी तक, मुझे कोई समस्या नहीं है और मैंने कभी ऐसा कोड नहीं देखा है जो कन्स्ट्रक्टर में सुपर() को कॉल करता है जो वर्ग स्प्राइट को बढ़ाता है।

टेक्स्टफ़िल्ल्ड के बारे में कैसे?
मुझे टेक्स्टफ़िल्ल्ड के बारे में भी कोई समस्या नहीं है।

मुझे कैसे पता चलेगा कि मुझे सुपर() या नहीं कहना चाहिए?क्या कक्षा में सुपर() को कन्स्ट्रक्टर में कॉल नहीं करना है जब कक्षा actioncript3 में स्प्राइट फैली हुई है?

उत्तर

28

फ़्लैश अपने बच्चे निर्माता में super() के लिए एक कॉल का पता लगाने के नहीं है तो फ्लैश से पहले आपके बच्चे के निर्माता परोक्ष कॉल super()होगा। तो:

public class Parent { 
    public function Parent() { 
     trace("Parent"); 
    } 
} 

public class Child extends Parent { 
    public function Child() { 
     trace("Child"); 
    } 
} 

new Child(); 
// Parent 
// Child 

तो अपने बच्चे को अनिवार्य रूप से निर्माता इस

public function Child() { 
     super(); // <-- Added by flash! 
     trace("Child"); 
    } 

तरह लग रहा है तो, नहीं, super() को सुस्पष्ट रूप से कॉल को छोड़ते हुए आमतौर पर पर प्रतिकूल अपने बच्चे के वर्ग को प्रभावित नहीं करेगा।

तो आप स्पष्ट रूप से super() क्यों कॉल करना चाहते हैं?

पहला कारण फ़्लैश ही कभी स्वचालित रूप से, super करने के लिए एक parameterless कॉल उत्पन्न होगा जिसका अर्थ है कि अगर आपके माता-पिता वर्गों निर्माता तर्क की आवश्यकता है, तो आप स्पष्ट रूप से उन तर्कों से कॉल करने की आवश्यकता होगी है। यदि आप इस मामले में super(args...) कॉल को छोड़ देते हैं, तो आपको एक कंपाइलर त्रुटि मिल जाएगी।

दूसरा, यदि आपके माता-पिता के पास पैरामीटर-कम कन्स्ट्रक्टर भी है, तो आप कन्स्ट्रक्टर निष्पादित करने के क्रम को नियंत्रित करने के लिए super() का उपयोग कर सकते हैं। फ़्लैश हमेशा बच्चों के कन्स्ट्रक्टर से पहले कॉल डालेंगे। तो अगर आप उस आदेश को बदलना चाहते थे। फिर

public class Child extends Parent { 
    public function Child() { 
     trace("Child"); 
     super() 
    } 
} 

विपरीत क्रम में ऐसा करेगा। या आप कर सकता है:

public class Child extends Parent { 
    public function Child() { 
     if(false) super() 
    } 
} 

क्योंकि फ़्लैश देखता है वहाँ एक फोन है, यह नहीं है:

public class Child extends Parent { 
    public function Child() { 
     // work before initilizing parent 
     super() 
     // work after initilizing parent 
    } 
} 

अन्त में, वहाँ एक बहुत ही अस्पष्ट तरीका को कह कर अपने माता-पिता निर्माता फोन नहीं एक डालें हालांकि क्योंकि if (false) के पीछे यह कभी भी नहीं बुलाया जाता है, इसलिए अभिभावक वर्ग कभी शुरू नहीं होता है।

+0

धन्यवाद! आप उस गुप्त कार्यक्षमता (स्वचालित सुपर सम्मिलन) को कैसे जानते थे? –

+4

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f30.html - ** कन्स्ट्रक्टर विधि ** –

+1

नामक अनुभाग के तहत माता-पिता कन्स्ट्रक्टर को दबाने का मतलब है कि किसी भी पूर्वजों के रचनाकारों को बुलाया नहीं जा सकता है या बस तत्काल superclass? –

1

आप बेस कन्स्ट्रक्टर को सुरक्षित रूप से कॉल को बहिष्कृत कर सकते हैं। यदि आप कन्स्ट्रक्टर में super() पर कॉल नहीं करते हैं, तो संकलक बिना किसी तर्क के बेस कन्स्ट्रक्टर को कॉल जोड़ देगा।

4

यदि आप स्पष्ट रूप से super() पर कॉल नहीं करते हैं, तो फ्लैश स्वचालित रूप से आपके कन्स्ट्रक्टर में अन्य सभी कोड से पहले स्वचालित रूप से करेगा।

यदि आप स्पष्ट रूप से super() पर कॉल करते हैं, तो इसे उस पंक्ति पर बुलाया जाएगा जिस पर आपने लिखा था।

हालांकि, ध्यान दें आपके द्वारा सेट किए नहीं कर सकते या किसी this या super गुण प्राप्त या किसी तरीकों फोन सुपर वर्ग के लिए एक महान जवाब के लिए instantiated से पहले