インターフェイス

インターフェイスは、関連しないオブジェクトを相互に通信可能にするメソッド宣言の集まりです。たとえば、Flash Player API では、クラスでイベントオブジェクトを処理するために使用できるメソッド宣言を含む IEventDispatcher インターフェイスを定義します。IEventDispatcher インターフェイスは、オブジェクトが相互にイベントオブジェクトを渡し合うための標準的な手段を確立します。次のコードは、IEventDispatcher インターフェイスの定義を示します。

public interface IEventDispatcher
{
    function addEventListener(type:String, listener:Function, 
            useCapture:Boolean=false, priority:int=0,
            useWeakReference:Boolean = false):void;
    function removeEventListener(type:String, listener:Function, 
            useCapture:Boolean=false):void;
    function dispatchEvent(event:Event):Boolean;
    function hasEventListener(type:String):Boolean;
    function willTrigger(type:String):Boolean;
}

インターフェイスは、メソッドのインターフェイスとその実装間の違いを基にしています。メソッドのインターフェイスには、メソッドの名前、すべてのパラメータ、および戻り値の型など、そのメソッドを呼び出すために必要なすべての情報が含まれます。メソッドの実装には、インターフェイス情報だけではなく、メソッドのビヘイビアを実行する実行可能ステートメントも含まれます。インターフェイス定義には、メソッドインターフェイスのみが含まれ、インターフェイスを実装するクラスはメソッドの実装を定義します。

Flash Player API では、EventDispatcher クラスは、IEventDispatcher インターフェイスのメソッドすべてを定義し、各メソッドにメソッドの本体を追加して、IEventDispatcher インターフェイスを実装します。次のコードは、EventDispatcher クラスの定義からの抜粋です。

public class EventDispatcher implements IEventDispatcher
{
    function dispatchEvent(event:Event):Boolean
    {
        /* 実装ステートメント */
    }

    ...
}

IEventDispatcher インターフェイスは、EventDispatcher インスタンスがイベントオブジェクトを処理し、IEventDispatcher インターフェイスを実装する他のオブジェクトに渡すために使用するプロトコルとして機能します。

インターフェイスは、クラスのようにデータ型を定義すると説明することもできます。したがって、インターフェイスはクラスのように型注釈として使用できます。インターフェイスは、データ型として is および as 演算子などのデータ型を必要とする演算子と使用することもできます。しかし、クラスとは異なり、インターフェイスをインスタンス化することはできません。この違いから、多くのプログラマはインターフェイスを抽象データ型、クラスを具象データ型と捉えています。

サブトピック

インターフェイスの定義
クラス内でのインターフェイスの実装

インターフェイスの定義

インターフェイス定義の構造は、クラス定義の構造に似ていますが、インターフェイスにはメソッド本体のないメソッドしか含めることができません。インターフェイスに変数や定数を含めることはできませんが、getters および setter は含めることができます。インターフェイスを定義するには、interface キーワードを使用します。たとえば、次の IExternalizable インターフェイスは、Flash Player API の flash.utils パッケージに含まれています。IExternalizable インターフェイスは、オブジェクトを直列化する、つまりオブジェクトをデバイスでの保存用またはネットワーク上の伝達用に適した形式に変換するためのプロトコルを定義します。

public interface IExternalizable
{
    function writeExternal(output:IDataOutput):void;
    function readExternal(input:IDataInput):void;
}

IExternalizable インターフェイスは、public アクセス制御修飾子で宣言します。インターフェイス定義は、public および internal アクセス制御指定子でのみ変更できます。インターフェイス定義内のメソッド宣言には、アクセス制御指定子を使用できません。

Flash Player API では、インターフェイス名は大文字の I で始まるという表記規則に従いますが、インターフェイス名には有効な任意の識別子を使用できます。インターフェイス定義は、通常パッケージの最上位に配置されます。クラス定義内または別のインターフェイス定義内に、インターフェイス定義を配置することはできません。

インターフェイスは、他のインターフェイスを拡張できます。たとえば、次の IExample インターフェイスは IExternalizable インターフェイスを拡張します。

public interface IExample extends IExternalizable
{
    function extra():void;
}

IExample インターフェイスを実装するクラスは、extra() メソッドの実装だけでなく、IExternalizable インターフェイスから継承した writeExternal() および readExternal() メソッドの実装も含む必要があります。

クラス内でのインターフェイスの実装

クラスは、インターフェイスを実装できる唯一の ActionScript 3.0 言語エレメントです。クラス宣言内で implements キーワードを使用して、1 つまたは複数のインターフェイスを実装します。次の例では、IAlpha および IBeta の 2 つのインターフェイスと、これら両方のインターフェイスを実装する Alpha クラスを定義します。

interface IAlpha
{
    function foo(str:String):String;
}

interface IBeta
{
    function bar():void;
}

class Alpha implements IAlpha, IBeta
{
    public function foo(param:String):String {}
    public function bar():void {}
}

インターフェイスを実装するクラスでは、実装されるメソッドは以下を行う必要があります。

実装するメソッドのパラメータには、ある程度自由に名前を付けることができます。実装されるメソッドとインターフェイスメソッドのパラメータ数および各パラメータのデータ型は一致する必要がありますが、パラメータ名を一致させる必要はありません。たとえば、前の例では Alpha.foo() メソッドのパラメータの名前は param です。

public function foo(param:String):String {}

しかし、IAlpha.foo() インターフェイスメソッドのパラメータの名前は str です。

function foo(str:String):String;

デフォルトのパラメータ値で柔軟性も得られます。インターフェイス定義は、デフォルトのパラメータ値を備えた関数宣言を含むことができます。このような関数宣言を実装するメソッドは、インターフェイス定義に指定されている値と同じデータ型のメンバーであるデフォルトのパラメータ値を持つ必要がありますが、実際の値が一致する必要はありません。たとえば、次のコードは、デフォルトのパラメータ値 3 を持つメソッドを含むインターフェイスを定義します。

interface Igamma
{
    function doSomething(param:int = 3):void;
}

次のクラス定義は、Igamma インターフェイスを実装しますが、異なるデフォルトパラメータ値を使用します。

class Gamma implements Igamma
{
    public function doSomething(param:int = 4):void {}
}

この柔軟性の理由は、インターフェイスを実装する規則がデータ型の互換性を確保するように特別に設計されているからで、同一のパラメータ名およびデフォルトパラメータ値を要求することはその目的の達成のために必要ありません。


Flex 2.01