2011-04-08 7 views
5

मैं हमेशा अपने प्रोग्रामिंग प्रथाओं को बेहतर बनाने की कोशिश कर रहा हूं और मेरी एक आदत ने मुझे यह सोचकर प्राप्त किया है कि शायद यह सबसे अच्छा तरीका नहीं है। MouseEvent फ़ंक्शन कॉल को संभालने पर मेरे पास पैरामीटर में MouseEvent से Event का उपयोग करने की प्रवृत्ति है।एएस 3: जब ईवेंट ठीक काम करता है तो माउसएवेंट को फ़ंक्शन परम के रूप में क्यों उपयोग करें?

उदाहरण:

mc.addEventListener(MouseEvent.CLICK, handleClick); 

private function handleClick(e:Event):void 
{ 
    trace(e.currentTarget.name + " was Clicked"); 
} 

वहाँ कुछ कार्यक्षमता या MouseEventEvent कक्षा में अनुपलब्ध के अंदर गुण है कि एक आवश्यकता के MouseEvent अधिक का उपयोग कर बनाना होगा है? एकमात्र कारण मैं अपने बारे में सोच सकता हूं कि आपके ईवेंट/फ़ंक्शंस को दृढ़ता से टाइप किया जाए।

उत्तर

11

यदि आप माउसइवेंट के रूप में पैरामीटर टाइप नहीं करते हैं, तो आपको माउसइवेंट सबक्लास के लिए विशिष्ट गुणों तक पहुंचने के लिए इसे केवल माउसवेन्ट के रूप में डालना होगा। उदाहरण के लिए:

यह काम करेगा नहीं:

private function handleClick(e:Event):void 
{ 
    trace("altKey down: "+e.altKey); 
} 

लेकिन यह होगा:

private function handleClick(e:MouseEvent):void 
{ 
    trace("altKey down: "+e.altKey); 
} 

हालांकि तो यह होगा (हालांकि अनुशंसित नहीं, नीचे देखें):

private function handleClick(e:Event):void 
{ 
    trace("altKey down: "+MouseEvent(e).altKey); 
} 

आम तौर पर, आप अपने श्रोता पैरामीटर प्रकार को सामान्य के रूप में सामान्य के रूप में चाहते हैं, ताकि यदि आपका फ़ंक्शन डब्ल्यू कहा जाता है गलत प्रकार की घटना के साथ, यह एक स्पष्ट तरीके से विफल रहता है।

आपका उदाहरण काम करता है क्योंकि वर्तमान लक्ष्य लक्ष्य इवेंट बेस क्लास की एक संपत्ति है। लेकिन आपके हैंडल को रोकना कुछ भी नहीं है IOErrorEvent या KeyboardEvent को प्राप्त करने और प्रतिक्रिया देने से क्लिक करें, और कुछ ऐसा करने से आप असफल होने की उम्मीद नहीं करते हैं (उदाहरण के लिए यदि आप इसे गलती से माउसवेन्ट के अलावा किसी अन्य चीज़ को सुनने के लिए सेट करते हैं, जिसे आप जानबूझकर नहीं करेंगे , लेकिन हो सकता है कि अगर आप कोड की addEventListener लाइन को कॉपी-पेस्ट करते हैं और ईवेंट प्रकार बदलते हैं लेकिन हैंडलर फ़ंक्शन को बदलना भूल जाते हैं ... ये चीज़ें होती हैं)।

+0

बहुत बढ़िया है, उदाहरण के और स्पष्टीकरण के लिए धन्यवाद। –

+0

कोई समस्या नहीं! मुझे शायद यह भी ध्यान दिया जाना चाहिए कि एक अन्य कारण यह टाइपिंग के साथ जितना विशिष्ट हो उतना विशिष्ट हो सकता है, यह है कि एएस 3 कंपाइलर आपके ईवेंट हैंडलर तर्कों का कोई संकलन-समय टाइपशेकिंग नहीं करता है। यह किसी भी मामले के लिए भी सही है जहां आप फ़ंक्शन संदर्भ पास करते हैं (जैसे कॉलबैक के लिए)। यदि आपके पास कोई प्रकार या तर्क गिनती है, तो यह रनटाइम ब्रेकेज होगा। लेकिन सबसे बुरी स्थिति अभी भी विफल नहीं होती है लेकिन यह चाहिए ... साथ ही, जब आप सही प्रकार "माउसइवेंट" का उपयोग करते हैं, तो आपको सभी उपलब्ध गुणों के लिए अपने कोड संपादक स्वत: पूर्ण से लाभ होगा। –

+0

इसके अलावा, जबकि आपका प्रश्न विशेष रूप से ईवेंट और इसके सबक्लास माउसइवेंट के बारे में है, अंतर्निहित अधिक सामान्य प्रश्न यह है कि: मुझे अपने उप-वर्गों के एक (या अधिक) के उदाहरण के लिए बेस क्लास संदर्भ का उपयोग कब करना चाहिए, और उस प्रश्न का उत्तर है एक त्वरित नहीं, बल्कि एक पुस्तक या विकिपीडिया से सामान्य रूप से बहुरूपता का स्पष्टीकरण: http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming –

0

माउसइवेंट ऑब्जेक्ट्स में ईवेंट ऑब्जेक्ट्स से परे जानकारी होती है। यही है, माउसवेवेंट घटना से विरासत में मिलता है। घटना का उपयोग इस अर्थ में करता है कि घटना श्रोता को बुलाया जाएगा, लेकिन यदि आपको घटना के माउस-विशिष्ट गुणों की आवश्यकता है तो बस बेस क्लास का उपयोग करना काम नहीं करेगा।

दूसरे शब्दों में इस सवाल का जवाब "हाँ" है:

वहाँ कुछ कार्यक्षमता या MouseEvent घटना कक्षा में अनुपलब्ध के अंदर गुण है कि MouseEvent एक आवश्यकता का अधिक उपयोग होता है?

एडम का उत्तर आपको एक उदाहरण परिदृश्य देता है।

  • प्रकार: स्ट्रिंग
  • बुलबुले: बूलियन
  • रद्द करने योग्य: बूलियन

इस से उपलब्ध जानकारी की एक सूची है

2
इस

एक Event से उपलब्ध जानकारी की एक सूची है MouseEvent:

  • प्रकार: स्ट्रिंग
  • बुलबुले: बूलियन
  • रद्द करने योग्य: बूलियन
  • localX: संख्या
  • localy: संख्या
  • relatedObject: InteractiveObject
  • ctrlKey: बूलियन
  • altKey: बूलियन
  • shiftKey: बूलियन
  • बटनडाउन: बूलियन
  • डेल्टा: int
  • commandKey: बूलियन
  • CONTROLKEY: बूलियन
  • clickCount: int

के रूप में आप देख सकते हैं, MouseEvent एक सामान्य से घटना के लिए और अधिक विशिष्ट डेटा होता है घटना ऑब्जेक्ट।

कुछ निम्नलिखित की तरह विफल हो जाएगा:

private function mouseEventHandler(evt:Event):void 
{ 
trace(evt.localX); 
}