大阪てら子 21 「AS3教えて!えらい人」にいってきました。
色々と勉強になる質問が飛び交い、先生達が勉強になる解答を示してくれて、私にとって、とっても有意義な時間になりました。
自分はinterface(インターフェース)について質問させてもらったんで、その内容をちょちょいとまとめておきます。
インターフェースってなに?
抽象的なクラスです。っと説明つきにくいので、↓を参照してください。
Java入門 | インタフェース
Javaの資料ですが、概念はActionScriptでもほとんど変わらないはずです。自分もモヤモヤっとしか理解してません。。。
もう少し具体的にどういう時に使うの?
インターフェースを実装 (implements)したクラスはインターフェースで定義されたメソッドを必ず実装しなければならない。(しなければコンパイルできない)
ってことは、複数人でコードを書く時にインターフェースを決めておけば、クラスが綺麗に統一されていくよー。みたいなことはググっていけば何となく理解できました。
ただし、システムのように大人数で開発することは余りなく、一人で実装することが多いFlashでは、インターフェースは必須ではないんじゃない?って疑問がふつふつと。
ということで、別な部分での利点を教えてください!
っていうことを質問したわけであります。
で、そのまとめを文章で説明しにくいので以下のasを!!
※車に無理矢理例えてみた。
※メソッドのok_wakattaYo1とok_wakattaYo2を見てなるほど!っと道が開ければ。。
teraco_osiete.as
package {
import flash.display.DisplayObject;
import flash.display.Sprite;
public class teraco_osiete extends Sprite
{
public function teraco_osiete() {
ok_wakattaYo1();
ok_wakattaYo2();
}
public function ok_wakattaYo1():void {
//var car:Car = new Car();
//っとするところを抽象的に
//var car:IMachine と変数宣言してみる。
var car:IMachine = new Car();
//そのままcarをaddChildするとIMachineはDisplayObjectでは
//ないので怒られる。なんでキャストする。
addChild(DisplayObject(car));
//上記2つと同様。
var carlogo:IMachine = new CarLogo();
addChild(DisplayObject(carlogo));
}
public function ok_wakattaYo2():void {
//Car(Sprite)とCarLogo(TextField)をインスタンス化して、配列にぶっこむ。
var machines:Array = [];
var car:Car = new Car();
var carlogo:CarLogo = new CarLogo();
machines.push(car);
machines.push(carlogo);
//配列の中身をfor eachでまわす時、受け取る変数をIMachineと定義する。
//IMachineにはdrawが定義されているので問題なくdrawできる。
//※抽象クラスを使うことによりSpriteを継承しているCarでもTextFieldを継承しているCarLogoでも
// 変数に格納できる。
for each (var obj:IMachine in machines) {
trace(obj);//1ループ目[object Car] , 2ループ目[object CarLogo]
obj.draw();
}
}
}
}
import flash.display.Sprite;
import flash.text.TextField;
import machine1.IMachine;
/**
* 抽象クラス「IMachine」を実装 (implements)したCarクラス
*/
class Car extends Sprite implements IMachine {
public function draw():void {}
}
/**
* 抽象クラス「IMachine」を実装 (implements)したCarLogoクラス
*/
class CarLogo extends TextField implements IMachine {
public function draw():void {}
}
/**
* 抽象クラス「IMachine」
* 抽象メソッド「draw」のシグネチャを定義
*/
interface IMachine {
function draw():void;
}
私と同じぐらいのas理解度の人はなるほどー!!ってなるはず。