カスタムコンポーネントを開発する前に、ActionScript の基本的なコーディングについて十分に理解しておく必要があります。
パッケージ内で 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 ステートメントによって定義されたクラスにアクセスできるように、そのクラスに参照が追加されます。読み込むクラスは、アプリケーションの 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 ステートメントを使用します。
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 つのクラスだけを定義できます。ファイルに複数のクラスを定義するには、パッケージ本体の外部に、クラスを追加して定義します。
ActionScript クラスでは、パブリックコンストラクタメソッドを定義する必要があります。このメソッドは、クラスのインスタンスを初期化します。コンストラクタの属性は次のとおりです。
コンストラクタ内の super() メソッドを呼び出すと、スーパークラスのコンストラクタが呼び出され、スーパークラスから継承されるアイテムが初期化されます。super() メソッドは、コンストラクタ内の 1 行目のステートメントとして記述する必要があります。1 行目に指定しないと、スーパークラスから継承される部分が適切に作成されないことがあります。場合によっては、最初にクラスを初期化してから 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.
}
}
プロパティを使用して、クラス内のデータ格納を定義できます。プロパティをパブリックとして定義すると、クラスのユーザーがアクセスできるようになります。一方、プロパティをプライベートとして定義すると、クラス内部で使用されます。次の例を参考にしてください。
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 メソッドを使用して、コンポーネントのプロパティを定義できます。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.methodName([arg1, ..., argN])
この方法は、スーパークラスのメソッドにビヘイビアを追加するだけでなく、そのスーパークラスメソッドを呼び出して元のビヘイビアを実行するようなサブクラスメソッドを作成する場合に便利です。
メソッドオーバーライドで super.myMethod() を呼び出すかどうかは、次のアプリケーション要件によって決まります。
スコープの設定とは、主に、this キーワードがそのときどきにアプリケーション内の何を参照するかを記述することです。メインの MXML アプリケーションファイルは、<mx:Application> タグを含んでいます。このファイルにおける現在のスコープは Application オブジェクトであるため、this キーワードはその Application オブジェクトを参照します。
ActionScript コンポーネントにおけるスコープは、コンポーネント自体であり、そのコンポーネントを参照するアプリケーションやその他のファイルではありません。その結果、コンポーネント内の this キーワードは、Flex Application オブジェクトではなくコンポーネントインスタンスを参照します。
非ビジュアル ActionScript コンポーネントは、parentDocument プロパティを使用して、親アプリケーションにアクセスすることはできません。ただし、mx.core.Application.application プロパティを使用して、最上位レベルの Application オブジェクトにアクセスできます。
スコープについて詳しくは、ActionScript の使用を参照してください。
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート