2009年5月6日水曜日

AS3でQueueとStackを実装してみた

スズキです。

Arrayでこと足りるのですが、まあ、お勉強もかねて、ということで…

まずはQueue/Stack共通のインターフェースです。おなじみのメソッドを定義しています。

--------【suz/lib/as3/common/Sequence.as】--------
package suz.lib.as3.common {
  public interface Sequence {
    function get size():uint;
    function push(item:*):void;
    function pop():*;
  }
}
--------

次に上記のインターフェースを実装する抽象クラス(っぽいもの)です。
ここでとりあえず、インターフェースで定義したメソッドを定義します。
子クラスの実装に任せる部分はpushImpl/popImplをオーバーライドする形にしています。

--------【suz/lib/as3/common/sequence/AbstractSequence.as】--------
package suz.lib.as3.common.sequence {
  import suz.lib.as3.common.Sequence;
  public class AbstractSequence implements Sequence {
    protected var list:Array = new Array();
    protected var length:uint = 0;
    public function AbstractSequence(length:uint = 0) { this.length = length; }
    public function get size():uint { return this.list.length; }

    public function push(item:*):void {
      if(this.length != 0 && this.list.length == this.length) { throw
new Error(); }
      else { this.pushImpl(item); }
    }

    public function pop():* {
      if(this.list.length == 0) { throw new Error(); }
      else { return this.popImpl(); }
    }

    protected function pushImpl(item:*):void { throw new Error(); }
    protected function popImpl():* { throw new Error(); }
  }
}
--------

そしてQueueです。まあ、実体はArrayのpushとshiftですが…

--------【suz/lib/as3/common/sequence/QueueSequenceImpl.as】--------
package suz.lib.as3.common.sequence {
  import suz.lib.as3.common.sequence.AbstractSequence;
  public class QueueSequenceImpl extends AbstractSequence {
    public function QueueSequenceImpl(length:uint = 0) { super(length); }
    protected override function pushImpl(item:*):void { this.list.push(item); }
    protected override function popImpl():* { return this.list.shift(); }
  }
}
--------

こちらはStackです。まあ、実体はArrayのpushとpopですが…

--------【suz/lib/as3/common/sequence/StackSequenceImpl.as】--------
package suz.lib.as3.common.sequence {
  import suz.lib.as3.common.sequence.AbstractSequence;
  public class StackSequenceImpl extends AbstractSequence {
    public function StackSequenceImpl(length:uint = 0) { super(length); }
    protected override function pushImpl(item:*):void { this.list.push(item); }
    protected override function popImpl():* { return this.list.pop(); }
  }
}
--------

最後に、使い方サンプルです。

--------【AS3】--------
//var sequence:Sequence = new StackSequenceImpl(3);
var sequence:Sequence = new QueueSequenceImpl(3);
sequence.push("test");
trace(sequence.size);
sequence.pop();
--------

エラーを発生させてるところは、ちゃんとしたエラークラスをつくらないと…手抜きだ…

--
http://suz-lab.blogspot.com/

0 コメント: