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 なクラスにすることにした。いつか調べるよいつか・・・
メンバ変数は・・・
アクセス指定子をつけないとエラーらしいよ。
private var test:int;
こんな感じ。まぁお堅いこと。
C++はデフォルトで public だったなっけ?わすれたけど。
あーー。ActionScript1の頃が一番自由で楽しかった気がする・・・
JavaScriptっぽくて・・・