Adobe Flex 3 ヘルプ

ActionScript の使用

カスタムコンポーネントを開発する前に、ActionScript の基本的なコーディングについて十分に理解しておく必要があります。

package ステートメントの使用

パッケージ内で ActionScript カスタムコンポーネントを定義する必要があります。パッケージには、アプリケーションのディレクトリ構造におけるコンポーネントのディレクトリの場所が示されます。パッケージ構造を定義するには、次の例に示すように、クラス定義で package ステートメントを指定します。

package myComponents
{
    // Class definition goes here.
}

package ステートメントは、クラス定義全体を囲む必要があります。ActionScript クラスファイルをその他のアプリケーションファイルと同じディレクトリに書き込む場合は、パッケージ名を空白のままにしても構いません。ただし、ベストプラクティスとして、コンポーネントをサブディレクトリに格納し、そのディレクトリの場所を示すパッケージ名を指定することをお勧めします。この例では、メインのアプリケーションディレクトリのサブディレクトリである myComponents に ActionScript クラスファイルを書き込みます。

フォーマッタは特定のタイプのコンポーネントです。アプリケーションのルートディレクトリのサブディレクトリとして myFormatters を作成し、そこにカスタムフォーマッタクラスをすべて格納することもできます。その後、次の例のように、フォーマッタクラスごとの package ステートメントを定義します。

package myFormatters
{
    // Formatter class definition goes here.
}

複数のアプリケーション間で共有されるコンポーネント、またはサードパーティ製コンポーネントと一緒に使用される可能性のあるコンポーネントを作成する場合は、名前が競合しないように一意のパッケージ名を割り当てる必要があります。例えば、次のようにパッケージ名の前に会社名を付けます。

package Acme.myFormatters
{
    // Formatter class definition goes here.
}

MXML ファイルからカスタムコンポーネントを参照する場合は、次の例に示すように、ディレクトリの場所とパッケージ名に対応した、コンポーネントの名前空間定義を指定します。

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:MyComp="myFormatters.*"> 

    <!-- Declare a formatter and specify formatting properties. -->
    <MyComp:SimpleFormatter id="upperFormat" formatString="upper"/>

    ...

</mx:Application>

フォーマッタクラスが、myFormatters/dataFormatters などの myFormatters のサブディレクトリ内にある場合は、package ステートメントは次のようになります。

package myFormatters.dataFormatters
{
    // Formatter class definition goes here.
}

その後、次の例に示すように、コンポーネントの名前空間定義を指定します。

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:MyComp="myFormatters.dataFormatters.*"> 

    <!-- Declare a formatter and specify formatting properties. -->
    <MyComp:SimpleFormatter id="upperFormat" formatString="upper"/>

    ...

</mx:Application>

import ステートメントの使用

クラスに必要な任意のクラスを読み込むには、import ステートメントを使用します。読み込むと、import ステートメントによって定義されたクラスにアクセスできるように、そのクラスに参照が追加されます。読み込むクラスは、アプリケーションの ActionScript ソースパス内に配置する必要があります。

次の例に示すように、実装の一部としてカスタムコンポーネントによって参照されるクラスを読み込みます。

package myComponents
{
    // Import necessary classes.
    import mx.core.Container;
    import mx.controls.Button;
    // Import all classes in the mx.events package
    import mx.events.*;

    // Class definition goes here. 

    // You can now create an instance of a Container using this syntax:
    private var myContainer:Container = new Container();

}

ActionScript では、インクルード操作と読み込み操作には明確な違いがあります。「インクルード」とは、ある ActionScript ファイルから他のファイルにコード行をコピーする操作のことです。インクルードするファイルは、インクルードを実行するファイルへの相対パス内に存在する必要があります。または絶対パスを指定する必要があります。「読み込み」とは、クラスファイルまたはパッケージに参照を追加して、外部クラスによって定義されたオブジェクトやプロパティにアクセスできるようにすることです。

インクルードと読み込みについて詳しくは、ActionScript の使用を参照してください。

class ステートメントの使用

クラス名を定義したり、そのスーパークラスを指定したりするには、次の例に示すように、class ステートメントを使用します。

package myComponents
{
    // Import necessary classes
    import mx.core.Container;
    import mx.controls.Button;
    // Import all classes in the mx.events package
    import mx.events.*;

    // Class definition goes here.
    public class MyButton extends Button {
        
        // Define properties, constructor, and methods.    
    
    }
}

コンポーネントのクラス定義には、接頭辞としてpublic キーワードを付ける必要があります。付けないと、MXML タグとして使用できません。クラス定義を含むファイルに内部クラス定義を追加することはできますが、パブリッククラス定義は 1 つしか記述できません。パッケージ定義の右中括弧の下にあるソースファイルの下部に内部クラス定義を配置します。

1 つの ActionScript ファイルには、パッケージ内に 1 つのクラスだけを定義できます。ファイルに複数のクラスを定義するには、パッケージ本体の外部に、クラスを追加して定義します。

注意: クラス定義は、MXML ファイルの <mx:Script> ブロック内で使用できない、いくつかの ActionScript コンストラクトの 1 つです。

コンストラクタの定義

ActionScript クラスでは、パブリックコンストラクタメソッドを定義する必要があります。このメソッドは、クラスのインスタンスを初期化します。コンストラクタの属性は次のとおりです。

  • 戻り値はありません。
  • パブリックとして宣言されている必要があります。
  • オプションのパラメータを指定できます。
  • MXML タグとして使用する場合は、必須パラメータを指定できません。
  • super() メソッドを呼び出して、スーパークラスのコンストラクタを呼び出します。

コンストラクタ内の super() メソッドを呼び出すと、スーパークラスのコンストラクタが呼び出され、スーパークラスから継承されるアイテムが初期化されます。super() メソッドは、コンストラクタ内の 1 行目のステートメントとして記述する必要があります。1 行目に指定しないと、スーパークラスから継承される部分が適切に作成されないことがあります。場合によっては、最初にクラスを初期化してから super() メソッドを呼び出す必要があります。

注意: コンストラクタを定義しないと、コンパイラによって挿入され、super() に呼び出しが追加されます。ただし、クラスに静的メンバーだけが含まれる場合を除き、コンストラクタを記述して、super() を明示的に呼び出すことをお勧めします。コンストラクタを定義し、super() の呼び出しを省略すると、Flex はコンストラクタの開始時に super() を自動的に呼び出します。

次の例では、super() メソッドを使用してスーパークラスのコンストラクタを呼び出すようにコンストラクタを定義します。

package myComponents
{
    // Import necessary classes
    import mx.core.Container;
    import mx.controls.Button;
    // Import all classes in the mx.events package
    import mx.events.*;

    // Class definition goes here.
    public class MyButton extends Button {
        
        // Public constructor. 
        public function MyButton()
        {
            // Call the constructor in the superclass. 
            super();
        }
        // Define properties and methods.    
    
    }
}

注意: MXML コンポーネントのコンストラクタを定義することはできません。詳しくは、IMXMLObject の実装についてを参照してください。

変数としてのプロパティの定義

プロパティを使用して、クラス内のデータ格納を定義できます。プロパティをパブリックとして定義すると、クラスのユーザーがアクセスできるようになります。一方、プロパティをプライベートとして定義すると、クラス内部で使用されます。次の例を参考にしてください。

public class MyButton extends Button {

    // Define private vars.
    private var currentFontSize:Number;

    // Define public vars. 
    public var maxFontSize:Number = 15;
    public var minFontSize:Number = 5;
}

次の例に示すとおり、クラスのユーザーはパブリック変数にはアクセスできますが、プライベート変数にはアクセスできません。

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:MyComp="myControls.*">

    <MyComp:MyButton label="Submit" maxFontSize="30"/>
</mx:Application>

パブリックプロパティを使用するようにクラスを定義できますが、setter および getter メソッドを使用してプロパティを定義した方が都合の良い場合があります。詳しくは、メソッドの定義を参照してください。

注意: 変数によって定義された継承プロパティはオーバーライドできませんが、setter および getter メソッドによって定義されたプロパティはオーバーライドできます。変数によって定義された継承プロパティの値はリセットできます。通常は、ActionScript コンポーネントのサブクラスのコンストラクタまたは MXML コンポーネントのイベントハンドラでリセットします。MXML コンポーネントではコンストラクタを定義できないためです。

getter および setter としてのプロパティの定義

setter および getter メソッドを使用して、コンポーネントのプロパティを定義できます。getter および setter のメリットは、次のアクションを実行できるように変数をパブリックへの直接アクセスから隔離する点です。

  • 設定時にプロパティに設定されるデータを調べて検証します。
  • プロパティの変更時に、そのプロパティに関連付けられたイベントをトリガします。
  • 読み取り時の戻り値を計算します。
  • 子クラスのオーバーライドを許可します。

getter および setter メソッドを定義するには、先頭がキーワード get または set で始まり、それにスペースとプロパティ名が続くメソッド名を指定します。次の例は、パブリックプロパティ initialCount と、このプロパティの値を取得および設定する getter および setter メソッドの宣言を示しています。

// Define internal private variable.
private var _initialCount:uint = 42;

// Define public getter.
public function get initialCount():uint {
    return _initialCount;
}

// Define public setter. 
public function set initialCount(value:uint):void {
    _initialCount = value;
}

慣例として、setter はパラメータ名に識別子の value を使用します。

プロパティの値を格納する変数には、getter または setter と同じ名前を付けることはできません。慣例として、変数名には、先頭が 1 つまたは 2 つのアンダースコア(__)で始まる名前を使用します。さらに、変数をプライベートとして宣言するか、または保護することをお勧めします。

次の例に示すように、クラスのユーザーはパブリックプロパティにアクセスできます。

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:MyComp="myControls.*" >

    <MyComp:MyButton label="Submit" initialCount="24"/>
</mx:Application>

getter または setter がスーパークラスの getter または setter をオーバーライドする場合は、次の例に示すように、override キーワードを必ず指定する必要があります。

override public function get label():String {}
override public function set label(value:String):void {}

メソッドの定義

メソッドは、クラスが実行可能な操作を定義します。クラス本体内でメソッドを定義できます。メソッドによってスーパークラスのメソッドをオーバーライドすることも、コンポーネントの新しい機能を定義することもできます。

メソッドにより新しい機能を追加する場合は、次の例に示すように、function キーワードを使用してメソッドを定義します。

public function myMethod():void {
    // Method definition 
}

メソッドをパブリックメソッドとして定義すると、クラスのユーザーから呼び出すことができます。

また、次の例に示すように、プライベートメソッドとして定義することもできます。

private function internalMethod():void {
    // Method definition 
}

プライベートメソッドは、クラスによって内部で使用され、クラスのユーザーから呼び出すことはできません。

メソッドがスーパークラスのメソッドをオーバーライドする場合は、次の例に示すように、override キーワードを指定し、メソッドのシグネチャはスーパークラスメソッドのシグネチャに正確に一致している必要があります。

override protected function createChildren():void {
    // Method definition 
}

メソッドには必須パラメータまたは省略可能なパラメータを指定できます。パラメータを省略可能にするには、次の例に示すように、パラメータにデフォルト値を割り当てます。

override public validate(value:Object = null, 
    supressEvents:Boolean = false):ValidationResultEvent {
    // Method definition 
}

メソッドのパラメータの個数が変化する場合は、次の例に示すように、「...」シンタックスを使用します。

function foo(n:Number, ... rest):void {
    // Method definition 
}

Flex は、省略可能なパラメータ用に rest という名前の配列を作成します。したがって、rest.length を使用してメソッドに渡すパラメータ数を決定し、rest[i] を使用してパラメータにアクセスできます。

メソッドオーバーライドでの super キーワードの使用

メソッドオーバーライドで super キーワードを使用して、対応するスーパークラスのメソッドを呼び出すことができます。super キーワードのシンタックスは次のとおりです。

super.methodName([arg1, ..., argN])

この方法は、スーパークラスのメソッドにビヘイビアを追加するだけでなく、そのスーパークラスメソッドを呼び出して元のビヘイビアを実行するようなサブクラスメソッドを作成する場合に便利です。

注意: Flex は、コンストラクタ内で super() メソッドを自動的に呼び出してスーパークラスのコンストラクタを実行しますが、メソッドオーバーライドでは、super.methodName() を明示的に呼び出す必要があります。明示的に呼び出さないと、スーパークラスのメソッドは実行されません。

メソッドオーバーライドで super.myMethod() を呼び出すかどうかは、次のアプリケーション要件によって決まります。

  • 通常はスーパークラスメソッドの既存の機能を拡張します。そのため、最も一般的なパターンとしては、メソッドオーバーライドで最初に super.myMethod() を呼び出してから、ロジックを追加します。
  • スーパークラスメソッドを動作させるために何かを変更しなければならない場合もあります。この場合は、ロジックの後に、オーバーライドで super.myMethod() を呼び出します。
  • メソッドオーバーライドの中には、スーパークラスメソッドをまったく呼び出す必要がないものもあります。スーパークラスを動作させるには、super.myMethod() を呼び出すだけで動作させることができます。
  • スーパークラスに何も実行しない空のメソッドがある場合は、そのメソッドに機能を実装する必要があります。この場合も、Flex の将来のバージョンでそのメソッドに何らかの機能が実装される可能性があるため、super.myMethod() を呼び出す必要があります。詳細については、各 Flex クラスのドキュメンテーションを参照してください。

スコープについて

スコープの設定とは、主に、this キーワードがそのときどきにアプリケーション内の何を参照するかを記述することです。メインの MXML アプリケーションファイルは、<mx:Application> タグを含んでいます。このファイルにおける現在のスコープは Application オブジェクトであるため、this キーワードはその Application オブジェクトを参照します。

ActionScript コンポーネントにおけるスコープは、コンポーネント自体であり、そのコンポーネントを参照するアプリケーションやその他のファイルではありません。その結果、コンポーネント内の this キーワードは、Flex Application オブジェクトではなくコンポーネントインスタンスを参照します。

非ビジュアル ActionScript コンポーネントは、parentDocument プロパティを使用して、親アプリケーションにアクセスすることはできません。ただし、mx.core.Application.application プロパティを使用して、最上位レベルの Application オブジェクトにアクセスできます。

スコープについて詳しくは、ActionScript の使用を参照してください。

 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート