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日