2007年7月アーカイブ

Singleton メモ

package
{
  public class Singleton
  {
    private static var instance:Singleton;
    
    function Singleton(caller:Function=null):void
    {
      if( caller != createInstance ) throw new ArgumentError("Cannot user access constructor.");
      
      trace("create new instance.");
    }
    
    private static function createInstance():Singleton
    {
      return new Singleton(arguments.callee);
    }
    
    public static function getInstance():Singleton
    {
      if( instance == null ){
        instance = createInstance();
      }
      return instance;
    }
  }
}
DisplayObjectを用いるのはいかがなものなんだろう。

package
{
  import flash.display.DisplayObject;
  public class Abstract extends DisplayObject
  {
    
  }
}

AS3ではクラスのコンストラクタ定義に private が使用できないので
普通に作ってると、作ったクラスがすべてインスタンス化できてしまう。

どうしてもインスタンス化されたくないクラスは DisplayObject を継承すれば
一応インスタンス化できなくなるんだけども。

使い方として間違ってる気がする。

しかも Singleton 的なことができない。
インスタンス化そのものができないから。

なんかいい方法がどっかに落っこちてないかなあ。

--追記

function Constructor()
{
  throw new ArgumentError ("#xxxx: Constructor Class cannot make a Instance.");
}
インスタンス化させないだけなら、単純にコンストラクタにエラーを返せばいいみたい。
AS3 の apply と call の scope が変更されない。

DocumentRootTimeline :: Frame Action
import flash.display.MovieClip;
var mc = new MovieClip();
test.apply( mc , null );
function test()
{
  trace(this);// [object MainTimeline]
}

---- 追記
ちなみにプロパティとして定義された関数には今まで通り適用されるみたい。

DocumentRootTimeline :: Frame Action
import flash.display.MovieClip;
var mc:MovieClip = new MovieClip();
var test = function()
{
  trace(this);
}
test.apply( mc );// [object MovieClip]

まいっちんぐ

---- さらに追記
こうやってもダメだった。

DocumentRootTimeline :: Frame Action
import flash.display.MovieClip;
var mc:MovieClip = new MovieClip();
function test()
{
  trace(this);
}
var tmp = test;
tmp.apply( mc );// [object MainTimeline]

サンプルデータを生成するツールを作成しました。

http://seyself.com/library/sampledata/

形式は「CSV」「TSV」「XML」「MySQL」の4種類

それぞれブラウザ表示とダウンロードから出力を選択できます。