<?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>unbland.org blog &#187; ActionScript</title>
	<atom:link href="http://unbland.org/blog/tag/actionscript/feed" rel="self" type="application/rss+xml" />
	<link>http://unbland.org/blog</link>
	<description>発見の日々の備忘録。主に Web にまつまる技術ネタ。</description>
	<lastBuildDate>Wed, 18 Nov 2009 03:31:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ActionScript 3 で抽象クラス</title>
		<link>http://unbland.org/blog/2008/10/30/182.html</link>
		<comments>http://unbland.org/blog/2008/10/30/182.html#comments</comments>
		<pubDate>Thu, 30 Oct 2008 06:45:19 +0000</pubDate>
		<dc:creator>muta244@admin</dc:creator>
				<category><![CDATA[Flash (ActionScript)]]></category>
		<category><![CDATA[ActionScript]]></category>

		<guid isPermaLink="false">http://unbland.net/blog/?p=182</guid>
		<description><![CDATA[Java でいう abstract 修飾子がないので疑似実装するしかないですが、今までは getQualifiedClassName() 使ってクラス名を取得後、文字列で判別してました。でも前回のエントリーで const [...]]]></description>
			<content:encoded><![CDATA[<p>Java でいう abstract 修飾子がないので疑似実装するしかないですが、今までは getQualifiedClassName() 使ってクラス名を取得後、文字列で判別してました。でも前回のエントリーで constructor プロパティの有用性を知ったので、こちらを使っての実装法を考えてみました。</p>
<p><strong>※ 09.04.09 追記:</strong><br />
Proxy を継承したクラスのインスタンスの場合で constructor プロパティを呼び出した場合、Object#constructor でなく Proxy#getProperty が優先的に呼ばれるので注意が必要です。Proxy クラスを継承したクラスには constructor のゲッターで自クラスの参照を返すことでこの問題を回避出来ます。</p>
<div style="position:relative;top:18px;margin-top:-18px;"><small><strong>ActionScript</strong></small>
</div>
<pre name="code" class="actionscript" style="margin:18px 0;">
// AbstractClass
package
{
    public class AbstractClass
    {
        public function AbstractClass():void
        {
            if (Object(this).constructor == AbstractClass) {
                throw new Error(&quot;このクラスは抽象クラスなので直接インスタンス化できません.&quot;);
            }
        }
    }
}

// SubClass
package
{
    public class SubClass extends AbstractClass
    {
        public function SubClass():void
        {

        }
    }
}
</pre>
<p>こんな感じにしておけば、new AbstractClass() だとエラーになりますが、new SubClass() だとインスタンス化できます。className プロパティとかを実装したいのであれば、やっぱり getQualifiedClassName() を使わないといけませんが、そうでなければこの方法で十分な気がします。</p>
<p>この方法を考えてる時に constructor プロパティの取得法がいまいち分からなかったんですが、<a href="http://twitter.com/seyself/status/981785730" target="_blank">seyself さんから教えて</a>いただきました。ありがとうございます。</p>
]]></content:encoded>
			<wfw:commentRss>http://unbland.org/blog/2008/10/30/182.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ActionScript 3 での色々な文字列の扱い方</title>
		<link>http://unbland.org/blog/2008/10/28/167.html</link>
		<comments>http://unbland.org/blog/2008/10/28/167.html#comments</comments>
		<pubDate>Tue, 28 Oct 2008 14:35:40 +0000</pubDate>
		<dc:creator>muta244@admin</dc:creator>
				<category><![CDATA[Flash (ActionScript)]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://unbland.net/blog/?p=167</guid>
		<description><![CDATA[ActionScript 内で JavaScript を操作する時には ExternalInterface を使いますが、複雑なことをする時にはどうしても以下のような感じになります。
これだと文字列の連結が多すぎで分かり [...]]]></description>
			<content:encoded><![CDATA[<p>ActionScript 内で JavaScript を操作する時には ExternalInterface を使いますが、複雑なことをする時にはどうしても以下のような感じになります。</p>
<div style="position:relative;top:18px;margin-top:-18px;"><small><strong>ActionScript</strong></small>
</div>
<pre name="code" class="actionscript" style="margin:18px 0;">
ExternalInterface.call(
    &quot;function ()&quot; +
    &quot;{&quot; +
        &quot;var temp = &#039;test&#039;;&quot; +
        &quot;temp += &#039;string&#039;;&quot; +
        &quot;alert(temp);&quot; +
    &quot;}&quot;
);
</pre>
<p>これだと文字列の連結が多すぎで分かりにくくなってしまうんですが、ActionScript は CDATA セクションを文字列として扱うためこんなやり方もあります。</p>
<p><code></p>
<div style="position:relative;top:18px;margin-top:-18px;"><small><strong>ActionScript</strong></small>
</div>
<pre name="code" class="actionscript" style="margin:18px 0;">
ExternalInterface.call(&lt;![CDATA[
    function ()
    {
        var temp = &quot;test&quot;;
        temp += &quot;string&quot;;
        alert(temp);
    }
]]&gt;);
</pre>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://unbland.org/blog/2008/10/28/167.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>AS3 での Singleton パターン実装</title>
		<link>http://unbland.org/blog/2008/10/23/160.html</link>
		<comments>http://unbland.org/blog/2008/10/23/160.html#comments</comments>
		<pubDate>Thu, 23 Oct 2008 03:37:48 +0000</pubDate>
		<dc:creator>muta244@admin</dc:creator>
				<category><![CDATA[Flash (ActionScript)]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[新規タグの追加]]></category>

		<guid isPermaLink="false">http://unbland.net/blog/?p=160</guid>
		<description><![CDATA[AS3 での Singleton パターン実装はなかなか面倒くさいやり方が多いですが、ちょっとシンプルな実装法を思いついたので紹介します。
※ 08.10.23 追記：
コンストラクタ内部で _instance = th [...]]]></description>
			<content:encoded><![CDATA[<p>AS3 での Singleton パターン実装はなかなか面倒くさいやり方が多いですが、ちょっとシンプルな実装法を思いついたので紹介します。</p>
<div style="position:relative;top:18px;margin-top:-18px;"><small><strong>ActionScript</strong></small>
</div>
<pre name="code" class="actionscript" style="margin:18px 0;">
package
{
    public class Singleton
    {
        private static var _instance:Singleton = new Singleton();

        public function Singleton():void
        {
            if (_instance)
            {
                throw new ArgumentError(&quot;Singleton クラスは外部からインスタンス化できません.&quot;);
            }
        }

        public static function get instance():Singleton
        {
            return _instance;
        }
    }
}
</pre>
<p>※ 08.10.23 追記：<br />
コンストラクタ内部で _instance = this をしていましたが、コメントを受けて修正しました。</p>
<p>内部で最初に new してしまっておくだけなんですが、今まで思いつきませんでした。問題になりそうな点があったらコメントお願いします。</p>
]]></content:encoded>
			<wfw:commentRss>http://unbland.org/blog/2008/10/23/160.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ActionScript 3 のフィルターについて。</title>
		<link>http://unbland.org/blog/2008/04/09/20.html</link>
		<comments>http://unbland.org/blog/2008/04/09/20.html#comments</comments>
		<pubDate>Tue, 08 Apr 2008 16:19:17 +0000</pubDate>
		<dc:creator>muta244@admin</dc:creator>
				<category><![CDATA[Flash (ActionScript)]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://unbland.net/blog/archives/2008/04/actionscript-3-%e3%81%ae%e3%83%95%e3%82%a3%e3%83%ab%e3%82%bf%e3%83%bc%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e3%80%82.html</guid>
		<description><![CDATA[以前、HiSprite クラスという、フィルター関連の設定をプロパティで行えるようにしたクラスを作成しました。ただ、これだと Sprite を継承した独自クラスなどに適用できません。ですので、この場合は委譲用クラスを実装 [...]]]></description>
			<content:encoded><![CDATA[<p>以前、<a href="http://www.libspark.org/browser/as3/Unbland/src/net/unbland/display/HiSprite.as" target="_blank">HiSprite</a> クラスという、フィルター関連の設定をプロパティで行えるようにしたクラスを作成しました。ただ、これだと Sprite を継承した独自クラスなどに適用できません。ですので、この場合は委譲用クラスを実装した方が実用的だと考えました。しかし、ことごとく壁にぶち当たり、結論から言うと断念。</p>
<p>そんなこんなを twitter で愚痴っていると、<a href="http://logi.nium.jp/" target="_blank">nium</a> 先生と <a href="http://www.be-interactive.org/" target="_blank">beinteractive</a> 先生からアドバイスを頂きました。<a href="http://twitter.com/nium/statuses/785120161" target="_blank">「元オブジェクトに触られた場合に整合性を取ることは委譲の永遠の課題」というコメント</a>などはとても参考になり、ありがたかったです。この場を借りてお礼申し上げます。両先生、ありがとうございました！</p>
<p>以下、色々試してみたメモ。<br />
<u><strong>3.</strong></u> 辺りはまだ望みがありそうなので、今後も試してみる予定です。</p>
<p><span id="more-20"></span><br />
<u><strong>1. 委譲元の filters プロパティから適用済みのフィルターを判別して実装。</strong></u></p>
<p>適用済みのフィルターを判別する際に問題が発生。filters プロパティは getter 内で中身のフィルターまで clone() しちゃってる模様。以下、検証用コード。</p>
<pre name="code" class="as3">package
{
    import flash.display.Sprite;
    import flash.filters.BlurFilter;

    public class Document extends Sprite
    {
        public function Document ():void
        {
            var blur:BlurFilter = new BlurFilter();
            filters = [blur];

            trace("trace :", filters[0], filters[0]);
            // trace : [object BlurFilter] [object BlurFilter]

            trace("trace :", filters[0] == filters[0]);
            // trace : false
        }
    }
}
</pre>
<p>描画処理のために配列を直接操作されたくないのだとは思うのですが、それならば setter 内で clone() して処理しててくれればよかったのに・・・と思うわけで。そこで、試しにもう一つ検証用コード。</p>
<pre name="code" class="as3">package
{
    import flash.display.Sprite;
    import flash.filters.BlurFilter;

    public class Document extends Sprite
    {
        public function Document ():void
        {
            var blur:BlurFilter = new BlurFilter();
            blur.blurX = 10;
            filters = [blur];
            blur.blurX = 100;

            trace("trace :", filters[0].blurX);
            // trace : 10
        }
    }
}
</pre>
<p>setter 内でもしっかり clone() されているみたいですね。描画処理のために、こればっかりはしょうがないんだなぁ、きっと。</p>
<p><u><strong>2. 委譲用クラスのために BitmapFilter 系クラスを継承したクラスを独自実装。</strong></u></p>
<p>独自実装するフィルタークラスは internal なり独自のネームスペースなりでかくまっておいて、 clone メソッドをオーバーライドして自分自身を返すようにしてしまおうと試みたのですが、そもそも BitmapFilter 系クラスは final されてて継承できませんでした。わぉ、盲点。</p>
<p><u><strong>3. Proxy クラスで委譲用クラスのためのフィルタークラスを実装。</strong></u></p>
<p>と思ったらすでに<a href="http://d.hatena.ne.jp/seagirl/20080205/1202146520" target="_blank">試されている</a>方がいらっしゃいました。しかし、filters は setter 内でクラス判別を行っているため、結局は駄目な模様。</p>
<p><u><strong>4. 委譲元の filters プロパティの奥地に委譲用のフィルターを格納。</strong></u></p>
<p>これも失敗。以下、検証用コード。</p>
<pre name="code" class="as3">package
{
    import flash.display.Sprite;
    import flash.filters.BlurFilter;

    public class Document extends Sprite
    {
        public function Document ():void
        {
            var blur:BlurFilter = new BlurFilter();
            var array:Array = [];

            // これは代入しても大丈夫。
            //array[0] = array;

            // これは代入すると Error がスローされる。
            array[100] = array;

            filters = array;
        }
    }
}
</pre>
<p>filters プロパティに代入する配列は綺麗に 0 から格納されてないと駄目でした。</p>
]]></content:encoded>
			<wfw:commentRss>http://unbland.org/blog/2008/04/09/20.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.384 seconds -->
