トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

クラスの使用と複数ファイル_Flex

クラスの使用と複数ファイル

クラスにて機能を分ける場合は、Javaのようにファイルごとに分けて管理することになります。

クラスのパッケージについて

たとえば、以下のようなディレクトリ構成の場合を考えます。

ClassTest.as
[my]
  [utils]
      AddFunc.as

ClassTest.asが呼び出し元のActionScriptファイルで、「my/utils」ディレクトリの「AddFunc」クラスを扱うとします。

この場合、AddFuncクラスは「my.utils」のパッケージに属することになります。

AddFunc.asの内容

package my.utils {
   public class AddFunc {
       private var m_strA:Array;
       
       public function AddFunc() {
           m_strA = new Array();
       }

       /**
        * 配列をクリア
        */
       public function Clear() : void {
           var len:int, i:int;
           
           len = m_strA.length;
           for(i = 0; i < len; i++) {
               m_strA.pop();
           }
       }
       
       /**
        * 文字列を配列に追加
        * @param[in]  str   追加する文字列
        */
       public function Add(str:String) : void {
           m_strA.push(str);
       }
       
       /**
        * 配列の要素数を取得
        * @return 配列の要素数
        */
       public function GetSize() : int {
           return m_strA.length;
       }
       
       /**
        * 配列の要素を取得
        * @param[in]  index  要素番号
        * @return 対応文字列
        */
       public function GetAt(index:int) : String {
           return m_strA[index];
       }
   }
}

この「AddFunc」クラスでは、Add()で文字列を配列に追加し、GetSize()で要素数の取得、GetAt(index)で指定の要素を取得、Clear()で要素を削除する、とします。

ここで、

package my.utils {

}

となっています。これは、(ルートのディレクトリから見て)my/utilsにてこの「AddFunc」が位置している、ということを示します。

アクセスの種類

public/privateなどの役割を表にします。

名称内容
public同じクラスもしくは、外部からアクセス可能
private同じクラスからしかアクセスできない
static「クラス名.関数名(...)」のようにしてアクセスできる。クラスを生成せずにアクセスできる。

たとえば、クラスAddFunc内に以下のような行があるとします。

   public class AddFunc {
      ...
      static public function Add(a:Number, b:Number) : Number {
           return (a + b);
      }
   }

この場合は外部からは

var c:Number = AddFunc.Add(24.5, 11.0);

のようにクラスをnewせずともアクセスできるようになります。ただし、static関数の場合に、この関数内でこのクラスのstaticでない変数や関数にアクセスすることはできないですので注意してください。

呼び出し元の ClassTest.as の記述

package {
   import flash.display.*;
   import flash.text.*;

   import my.utils.*;  ///< AddFunc.asのあるディレクトリ

   public class ClassTest extends Sprite {
       public function ClassTest() {
           var c:AddFunc;
           var len:int;
           var str:String;

           // テキストフィールドの作成
           var m_Text1:TextField = new TextField();
           m_Text1.x = 0;
           m_Text1.y = 0;
           
           addChild(m_Text1);
           
           // クラスAddFuncの作成
           c = new AddFunc();
           c.Add("A");
           c.Add("B");
           c.Add("C");
           
           // 要素数を取得
           len = c.GetSize();
           
           // 0番目の要素を取得
           str = c.GetAt(0);
           
           m_Text1.text = "要素数 : " + String(len) + " " + str;
       }
   }
}

クラスのありかの明示

import my.utils.*;

のようにして、クラスが存在するディレクトリを指定します。

クラスの使用

デフォルトで存在するStringなどのクラスと同様に

var c:AddFunc;

のように記載して、

c = new AddFunc();

のように生成できます。

c.Add("A");
c.Add("B");
c.Add("C");
len = c.GetSize();
str = c.GetAt(0);

のように、publicの関数にアクセスしています。

以上、簡単な例ではありましたが、大きなプロジェクトになるとクラスに分けて管理するのは必須になりますので(でないとスパゲッティになります)、機能ごとにファイル(クラス)に分離して管理するように心がけるといいと思います。

複数ファイルがある場合のxmlcでのコンパイル

mxmlc -default-size 300 300
  -default-frame-rate 20
  -default-background-color #e0ffe0
  -target-player 10
  ClassTest.as

のように、ルートになるasファイルを指定するだけで、後は関連するディレクトリのソースは自動的に検索されてまとめられるようです。

Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.