インターフェイスは、コンポーネントのアウトラインとして動作するように設計する一種のクラスです。インターフェイスを記述する場合は、実装ではなく、パブリックメソッドの名前だけを指定します。例えば、2 つのメソッドをインターフェイスに定義し、そのインターフェイスを実装した場合、実装クラスはこれらの 2 つのメソッドの実装を提供しなければなりません。
ActionScript 内のインターフェイスは、setter メソッドおよび getter メソッドを使用してメソッドおよびプロパティだけを宣言できます。定数を指定することはできません。インターフェイスのメリットは、そのインターフェイスを実装するすべてのクラスが従わなければならない約束ごとを定義できることです。さらに、クラスでインターフェイスを実装すると、当該クラスのインスタンスをそのインターフェイスにキャストできるようになります。
カスタム MXML コンポーネントは、他の ActionScript クラスと同じようにインターフェイスを実装できます。インターフェイスを実装するには、implements 属性を使用します。この属性は、すべての MXML タグでサポートされています。
次のコードは、いくつかのメソッドを宣言するシンプルなインターフェイスの例です。
// The following is in a file named SuperBox.as.
interface SuperBox {
function selectSuperItem():String;
function removeSuperItem():Boolean;
function addSuperItem():Boolean;
}
SuperBox インターフェイスを実装するクラスでは、implements 属性を使用してインターフェイスを指定します。このクラスでは、メソッドを実装する必要があります。カスタム ComboBox コンポーネントの次の例では、SuperBox インターフェイスを実装します。
<?xml version="1.0"?>
<!-- StateComboBox.mxml -->
<mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml" implements="SuperBox">
<mx:Script>
<![CDATA[
public function selectSuperItem():String {
return "Super Item was selected";
}
public function removeSuperItem():Boolean {
return true;
}
public function addSuperItem():Boolean {
return true;
}
]]>
</mx:Script>
<mx:dataProvider>
<mx:String>AK</mx:String>
<mx:String>AL</mx:String>
</mx:dataProvider>
</mx:ComboBox>
次の例に示すように、個々のインターフェイスをカンマで区切ることで、複数のインターフェイスを実装できます。
<mx:ComboBox xmlns:mx="http://www.adobe.com/2006/mxml" implements="SuperBox, SuperBorder, SuperData">
インターフェイス内で宣言したメソッドはすべてパブリックと見なされます。インターフェイスを宣言した後で実装する際に、そのインターフェイスの一部のメソッドを実装しなかった場合は、MXML コンパイラによりエラーがスローされます。
カスタムコンポーネントに実装されたメソッドは、インターフェイスの対応するメソッドと同じ戻り値の型を持つ必要があります。インターフェイスに戻り値の型が指定されていない場合は、実装するメソッドで、任意の戻り値の型を宣言できます。
MXML コンポーネントのコンストラクタを定義することはできません。定義すると、Flex コンパイラから重複する機能を定義したことを示すエラーメッセージが発行されます。
通常、Flex コンポーネントには、コンストラクタの代わりにイベントリスナーを使用できます。例えば、目的に応じて preinitialize、initialize または creationComplete イベントのイベントリスナーを記述してコンストラクタに置き換えることができます。
これらのイベントはすべて UIComponent クラスによって定義され、そのすべてのサブクラスに継承されます。UIComponent のサブクラスではない MXML コンポーネントを作成する場合、これらのイベントを利用することはできません。代わりに、次の例に示すように IMXMLObject インターフェイスを MXML コンポーネントに実装し、その後に IMXMLObject.initialized() メソッドを実装することができます。
<?xml version="1.0"?>
<!-- mxmlAdvanced/myComponents/ObjectComp.mxml -->
<mx:Object xmlns:mx="http://www.adobe.com/2006/mxml"
implements="mx.core.IMXMLObject">
<mx:Script>
<![CDATA[
// Implement the IMXMLObject.initialized() method.
public function initialized(document:Object, id:String):void {
trace("initialized, x = " + x);
}
]]>
</mx:Script>
<mx:Number id="y"/>
<mx:Number id="z"/>
<mx:Number id="x"/>
</mx:Object>
Flex は、コンポーネントのプロパティを初期化した後で IMXMLObject.initialized() メソッドを呼び出します。次の例では、このコンポーネントを使用しています。
<?xml version="1.0"?>
<!-- mxmlAdvanced/MainInitObject.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:MyComp="myComponents.*"
creationComplete="initApp();">
<mx:Script>
<![CDATA[
public function initApp():void {
myTA.text="myFC.x = " + String(myFC.x);
}
]]>
</mx:Script>
<MyComp:ObjectComp id="myFC" x="1" y="2" z="3"/>
<mx:TextArea id="myTA"/>
</mx:Application>
前の例で実行する SWF ファイルは以下のとおりです。
Flex は、コンポーネントのプロパティを初期化した後で IMXMLObject.initialized() メソッドを呼び出すので、IMXMLObject.initialized() メソッドに実装されている trace() 関数は、次の結果を出力します。
initialized, x = 1
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート