packageの外からのクラス生成

【Main.as】
package {
	import flash.display.*;

	public class Main extends MovieClip {
		public function Main() {
			var c1:class1 = new class1();
			var c2:class2 = new class2();
		}
	}
}

class class1 {
	public function class1() {}
}

【class2.as】
package {
	public class class2 {
		function class2() {
			//var c1:class1 = new class1(); ←コンパイルエラー
		}
	}
}

classの下にclassはネストできないので、ちょこっとした処理のクラスを作りたい場合はpackageの外にかく。これでそのファイル内でしかアクセスできないようになる。


Mainからclass1は生成できるが、class2からclass1の生成は出来ないのでちゃんと隠蔽できている。外部のpackageを読み込むときの注意として

import flash.display.*;
package {

この位置におくとコンパイルエラーとなる。

package {
  内部の処理
}

import flash.display.*;
class class1 extends MovieClip {
	public function class1() {}
}

この位置におけば大丈夫。これはちょこっと処理をまとめたいときに重宝するなり。まぁむしろクラスのネストを許可しろよと言いたいw

getとsetを使ったアクセス

アクセサメソッドを作る場合

function (set or get) メソッド名

こんな感じにするとよい。(set or get)とメソッド名の間は空けないといけない。
以下サンプルコード。

package {
	import flash.display.*;
	
	public class Main extends MovieClip {
		public function Main() {
			var c1:class1 = new class1();
			c1.text = "hoge";
			trace(c1.text);
		}
	}
}

class class1 {
	private var __text:String;
	
	public function set text(t:String):void { __text = t; }
	public function get text():String { return __text; }
}

こんな感じになる。これでクラスを使っているユーザーは変数に直接アクセスしている感じを味わえるとさ。めでたしめでたし。というかやっぱりOSSでみんなで作るとなるとアクセサメソッドいるのかー。めんどくさす。


僕は趣味で作るときはメソッドもプロパティも全部publicでプロパティには直接アクセスというトリッキーなことしてたからな。でも一人で作るならそれで十分なんだなー。でもまぁOSSでやる場合は気をつけるお。

アクセス演算子によってプロパティの名前を変える命名規則

僕がphpでやるときに使っているルール。どうせならこちらでも適応してみる。
アクセス演算子によって「_」をつけるルール。publicならなし。protectedなら1つ。privateなら2つ。

public var str:String;
protected var _str:String;
private var __str:String;

こんな感じ。privateのプロパティは(set or get)のアクセサメソッド(後述)と合わせて使うとさらによい。

singletonはこうやる

http://d.hatena.ne.jp/Maaboo/20070310/1173519571


ここの疑問が解決した。2chでblog晒したら解答がきた。以下参考URL


http://weblogs.macromedia.com/akamijo/archives/2005/12/index.cfm
http://subtech.g.hatena.ne.jp/secondlife/20070219/1171877084


まぁこれも教えてもらったサイトなんだけどねwめちゃ感謝です。以下は参考サイトにアクセサメソッドと命名規則を適応した焼き直しコードです。

【Main.as】
package {
	import flash.display.*;

	public class Main extends MovieClip {
		public function Main() {
			var singleton:Singleton = Singleton.instance;
		}
	}
}

【Singleton.as】
package { 
  public class Singleton {
    private static var __instance:Singleton;
 
    public function Singleton(x:PrivateClass) {
    }
 
    public static function get instance():Singleton {
      if(Singleton.__instance == null) {
        Singleton.__instance = new Singleton(new PrivateClass());
      }
      return Singleton.__instance;
    }
  }
}

class PrivateClass {
}

こんな感じになる。面白いと思ったところといえば

    public function Singleton(x:PrivateClass) {
    }

〜中略〜

class PrivateClass {
}

ここが面白かった。PrivateClassクラスはSingletonクラスからしかみることが出来ないので他からは絶対生成できない。うまいことやっとるわ。あとなんか今日学んだことの集大成っぽくなってかなりGOOD!!


明日からはお絵かきツールをつくってみるお。


P.S.
http://weblogs.macromedia.com/akamijo/

とりあえずここの人のBlogが神すぎる。量が多いので全部は見れてないが、なんか困ったことがあればここみれば大体解決しそうな悪寒がするwww


というかドメインみたら今はなきmacromediaなんですけどwwwこの人はなにものじゃ?