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

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

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

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

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でやる場合は気をつけるお。

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

クラスのネストはできない

ので気をつけるように・・・なんで出来ないんだろうなー。ケチケチケチ!!!

仕方ないので private なクラスを作ってみた。同じファイル内なら出来ると思ったんだけど出来ない。ケチケチケチ。エラー文では、

エラー: private 属性はクラスプロパティの定義でのみ使用できます。

と言うんですがなんなんですかあなたは?クラスプロパティ言われても分かりませんがな。でも・・・singletonの解答はココ(private なクラス)にあるかも知れんぞ?チェケラー!!んで、ぐぐったらリモートクラスってのが出てきた。

http://www.linkcom.co.jp/flex/dojo17.htm

[RemoteClass(alias="org.hogehoge")]

ってな感じらしい・・・んーわけ分からん。関係があるのかも分からん。↑は private にパッケージを読み込んでるということでいいのかな?かな?

というかこういう余計なこと調べたら作業が前に進まんから!!今回は public なクラスにすることにした。いつか調べるよいつか・・・

定数の使い方

static private const hoge:int = 10;

なんと! var の代わりの const を置くらしい。なるほろ。よく考えたら var って変数って意味だよな。なんでコロンの後に型なのかと思ったけどこれで少し納得・・・しても・・・いいかも・・・


よーし。とりあえずこれで基本的な感じはつかめた。後はインターフェースがつかえるかどうかだけど、大丈夫!俺インターフェース使えないからwいまいち使い方が分からない。「デザインパターン勉強しろ」ですか、そうですか。

デフォルト引数はつかえるよ

クラスのメンバ変数とかで

private var hoge:Sprite = new Sprite();

はできる。コンストラクタでしなくてもいいので楽。関数の引数も

public function foo(text:String="test") { }

って感じでデフォルト引数を指定できる。よかったー。これ以上堅い言語になったら逃げ出しちゃいそうだぜ。なぜRuby方面に進化してくれなかったんでしょうね・・・スピードかな?


イテレーターとか使えてたらネ申なのに、作るのが楽しくて楽しくて仕方なくなるだろうなー(遠い目)

メンバ変数は・・・

アクセス指定子をつけないとエラーらしいよ。

private var test:int;

こんな感じ。まぁお堅いこと。
C++はデフォルトで public だったなっけ?わすれたけど。
あーー。ActionScript1の頃が一番自由で楽しかった気がする・・・
JavaScriptっぽくて・・・