AS2 では、パフォーマンスの観点からインターフェースの使用は控えるべきと言われていました。が、AS3 からはようやくその恩恵に与ることができそうです。実際、Flex2 のフレームワークでもインターフェースが多用されています。
インターフェースの定義
インターフェースは公開するメソッドの集合としての型を定義するのに使います。例えば、こんな感じです。
public interface ISample { function sampleFunc(arg:String = "hey"):Void; }
この例では、「sampleFunc という名前で hey という初期値の String 型の引数を一つ持ち返り値の型が Void である関数」を持つ型を定義し、それに ISample という名前をつけています。クラス定義と異なり、メソッドの定義だけが記述されています。メソッド本体はインターフェースを直接継承するクラス毎にオーバーライドして実装します。
public class SampleClass implements ISample { public function sampleFunc(arg:String = "hey"):Void { // メソッド本体を記述 } }
インターフェースの継承は implements キーワードで宣言します。 このときインターフェースに定義されている全てのメソッドをオーバーライドする必要があります。オーバーライドするメソッドに public を宣言して、それ以外はインターフェース内の定義とまったく同じにします。
なお、静的メンバはインターフェースには定義できません。
インターフェースとプロパティ
以前に get と set についての記事で、アクセッサを定義すると関数名をプロパティのように扱えることを書きました。get も set も関数ですからインターフェースに定義することができます。つまり、実質的にインターフェースにもプロパティを定義できることになります。
ちょっと例を見てみましょう。
// インターフェースに get/set を定義 public interface IGetSet { function get myProp():String; function set myProp(val:String):Void; } // 上記のインターフェースを実装 public class SampleClass implements IGetSet { private var privateVar:String; public function get myProp():String { return privateVar; } public function set myProp(val:String):Void { privateVar = val; } }
IGetSet を正しく実装したクラスでは以下のような操作ができるようになります。
var sc:SampleClass = new SampleClass(): sc.myProp = "hello"; trace(sc.myProp); // hello が出力される
コメントする