<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ActionScript 3 Lover &#187; inheritance</title>
	<atom:link href="http://as3blog.com/tag/inheritance/feed/" rel="self" type="application/rss+xml" />
	<link>http://as3blog.com</link>
	<description>Focus on ActionScript 3</description>
	<lastBuildDate>Thu, 19 Nov 2009 04:51:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>继承时事件（Event）的一些表现</title>
		<link>http://as3blog.com/as3/how-is-addeventlistener-working-in-inheritance/</link>
		<comments>http://as3blog.com/as3/how-is-addeventlistener-working-in-inheritance/#comments</comments>
		<pubDate>Mon, 27 Oct 2008 14:18:42 +0000</pubDate>
		<dc:creator>Aw</dc:creator>
				<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[inheritance]]></category>
		<category><![CDATA[override]]></category>

		<guid isPermaLink="false">http://as3blog.com/as3/how-is-addeventlistener-working-in-inheritance/</guid>
		<description><![CDATA[由于事件（Event）的特殊性，在继承（inheritance）中，往往容易被我们所误用。
一个简单的例子：
某类A继承自Sprite
package      {       &#160;&#160;&#160; import flash.display.Sprite;       &#160;&#160;&#160; import flash.events.Event;       &#160;&#160;&#160; public class A extends Sprite       &#160;&#160;&#160; {       &#160;&#160;&#160;&#160;&#160;&#160;&#160; function A(a:String = [...]]]></description>
			<content:encoded><![CDATA[<p>由于事件（Event）的特殊性，在继承（<a title="inheritance" href="http://as3blog.com/tag/inheritance">inheritance</a>）中，往往容易被我们所误用。</p>
<p>一个简单的例子：</p>
<p>某类A继承自Sprite</p>
<blockquote><p>package      <br />{       <br />&#160;&#160;&#160; import flash.display.Sprite;       <br />&#160;&#160;&#160; import flash.events.Event;       <br />&#160;&#160;&#160; public class A extends Sprite       <br />&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; function A(a:String = &quot;t&quot;)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; super();       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; trace(a);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.addEventListener(Event.ADDED_TO_STAGE, init);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected function init(e:Event):void       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; trace(&quot;A added!&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160; }       <br />}</p>
</blockquote>
<p>某类B，继承自A</p>
<blockquote><p>package      <br />{       <br />&#160;&#160;&#160; import flash.display.Sprite;       <br />&#160;&#160;&#160; import flash.events.Event;       <br />&#160;&#160;&#160; public class B extends A       <br />&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; function B()       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; super(&#8217;x');       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; trace(&quot;B&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //this.addEventListener(Event.ADDED_TO_STAGE, init);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; protected override function init(e:Event):void       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; super.init(e);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; trace(&quot;B added!&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160; }       <br />}</p>
</blockquote>
<p>文档类代码：</p>
<blockquote><p>var b:B = new B();      <br />addChild(b);</p>
</blockquote>
<p>可以看到，最优雅的方式是：</p>
<ol>
<li>在子类B中，如果继承自父类的函数已经添加了侦听器（这里是构造器），那么事件是会有响应的，不必再添加侦听器</li>
<li>如果子类B中没有init，那么将执行父类的init回调函数（callback Handler）</li>
<li>如果子类B中有init，那么有两种可能：一种是把A、B两个类的init全部写为private的，与上面一样，B的init不会被事件触发。不过，这种需求很少遇到</li>
<li>我们经常遇到的需求是，需要B执行回调函数，但有一些特定的功能。就如同我们常用的override一样，因此，我们把A、B的init都定为protected的；注意，B的init前面要加修饰符override</li>
<li>然后，在B的init里面，用super.init()调用父类的init函数，剩下的部分写入B需要的逻辑即可。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://as3blog.com/as3/how-is-addeventlistener-working-in-inheritance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

