サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

5. インタフェースの作成と使用

ID: FN0311005 Product: Flash

Platform: All
Version: Flash MX 2004

5.1 インタフェースの作成と使用について
オブジェクト指向プログラミングでは、インタフェースには、クラスと同じくメソッドが宣言されます。しかし、それだけで、何も「実行」(do)はしません。つまり、インタフェースは、「空の」(empty)メソッドで構成されます。

インタフェースのひとつの使い方は、後述のように独立したクラス間のプロトコルを指定することです。たとえば、プログラマのチームに参加して、各自は大規模なアプリケーションの異なった部分、つまり異なったクラスを担当するとします。クラスの多くは独立しています。しかし、異なったクラス間でコミュニケーションを取る手段は必要です。それは、すべてのクラスが準拠すべきインタフェースの定義、あるいはコミュニケーションプロトコルが必要だということです。

このための方法としては、Communicationクラスを作成して、これらすべてのメソッドを定義することが考えられます。そして、各クラスはこのスーパークラスを拡張・継承します。しかし、アプリケーションは、独立したクラスから構成されています。それらを共通のクラス階層に組込むのは、適切とはいえないでしょう。もっとよい解決策は、インタフェースを作成して、クラス同士のやり取りに使用するメソッドを宣言することです。そのうえで各クラスは、それらのメソッドを実装(独自に定義)します。

インタフェースを使用しなくても、通常問題なくプログラムは作成できます。しかし、インタフェースは、適切に利用することで、アプリケーションのデザインを、エレガントで拡張性があり、メンテナンスのしやすいものにしてくれます。

5.2 インタフェースの作成
インタフェースを作成する手順は、クラスの作成と同じです。クラスと同様に、インタフェースは外部ActionScript(AS)ファイルにのみ定義することができます。インタフェースは、キーワード'interface'を使って宣言し、続けてインタフェース名を書きます。そして、始まりと閉じの中括弧内にインタフェースの本体を定義します。

interface interfaceName {
  // インタフェースメソッド宣言
}

インタフェースは、メソッド(関数)の宣言のみで構成されます。その定義には、引数や引数の型、関数の戻り値の型が含まれます。たとえば、以下のコードは、MyInterfaceという名前のインタフェースを宣言して、2つのメソッドmethod_1()とmethod_2()をその内容としています。1番目のメソッドは引数を取らず、戻り値の型がありません('Void'と指定されています)。2番目のメソッドは、'String'型の引数をひとつ取り、戻り値の型として'Boolean'が指定されています。

interface MyInterface {
  function method_1():Void;
  function method_2(param:String):Boolean;
}

インタフェースでは、変数の宣言や代入を行うことはできません。インタフェースで宣言した関数には、中括弧を含めることもできません。たとえば、以下のインタフェースはコンパイルできません。

interface BadInterface {
  // コンパイラエラー。変数の宣言はインタフェースでは許されません。
  var illegalVar;

  // コンパイラエラー。関数本体はインタフェースでは許されません。
  function illegalMethod() {
  }
}

インタフェースに名前をつけたり、パッケージに格納したりするときの規則は、クラスの場合と同じです。「クラスの作成と使用」および「パッケージの使用」をご参照ください。

5.3 データ型としてのインタフェース
クラスと同じように、インタフェースは新たなデータ型を定義します。インタフェースを実装するクラスは、そのインタフェースによって 定義された型として扱われます。これはあるオブジェクトが特定のインタフェースを実装しているかどうかを判定するときに役立ちます。たとえば、以下のインタフェースを考えてみましょう。

interface Moveable {
  function moveUp();
  function moveDown();
}

ここでクラスBoxが、Moveableインタフェースを実装するとします。

class Box implements Moveable {
  var x_pos, y_pos;

  function moveUp() {
    // メソッド定義
  }
  function moveDown() {
    // メソッド定義
  }
}

そして、別のスクリプトでBoxクラスのインスタンスを作成するとき、変数をMoveable型で宣言することができます。

var newBox:Moveable = new Box();

Flash Player 7以降のランタイムでは、式をインタフェースの型にキャストすることができます。その式がインタフェースを実装するオブジェクトであるか、インタフェースを実装するスーパークラスをもっていれば、オブジェクトが返されます。そうでなければ、'null'が返ります。これは、あるオブジェクトが特定のインタフェースを実装しているかどうかを確認したい場合に役立ちます。

たとえば、以下のコードは、まずsomeObjectという名前のオブジェクトがMoveableインタフェースを実装しているかどうかをチェックし、それからmoveUp()メソッドをオブジェクトに対して呼出しています。

if (Moveable(someObject) != null) {
  someObject.moveUp();
}

出典
ActionScript Reference Guideより邦訳。

_____
作成者: 野中文雄
作成日: 2003年11月27日


Copyright © 2001-2003 Fumio Nonaka.  All rights reserved.