私のライブラリには、blueBox() コンストラクター、いくつかの変数、および MOUSE_DOWN イベントを処理する関数を保持する対応するクラス blueBox.as を持つ、blueBox という名前の movieClip があります。blueBox.as とほぼ同じクラスを必要とする redBox という movieClip もあります。コンストラクターの名前と変数の値のみを手動で変更せずに redBox.as として保存して、blueBox.as を複製することは可能ですか? 今のところ手動で行うことは大きな問題ではありませんが、このプロジェクトが成長するにつれて、意味のない量のファイルが作成され、すべて同じ情報が含まれます。これは少し冗長に思えます。洞察を歓迎します。
2 に答える
さまざまな種類のムービークリップを表示できるBoxクラスが必要なようです。そのクラスを取得したら、それぞれが異なるムービークリップ(redBox、blueBoxなど)を使用して、そのクラスの複数のインスタンスを作成できます。
これは、継承を使用することで解決できます。これは、MovieClip
クラスから拡張することで既に使用している概念です。クラスから継承すると、その実装を借用することになり、より具体的な機能をクラスに追加したり、スーパークラスの実装をオーバーライドすることさえできます。
工夫された例を見てみましょう:
次のようなクラスがあるとします。
public class BlueBox extends MovieClip {
private var color:uint;
public function BlueBox() {
this.color = 0x0000FF;
this.addEventListener(MosueEvent.MOUSE_DOWN, handler)
redraw();
}
// Mouse handler
private function handler(e:MouseEvent):void {
trace("DOWN!");
}
// some internal work
private funciton redraw() {
this.graphics.clear();
this.graphics.beginFill(this.color);
this.graphics.drawRect(10,10,50,50);
}
// other methods.
}
そして、非常によく似たRedBox
クラスを作成して、 に変更color
したいとします0xFF0000
。
そのため、現在、 はBlueBox
その機能を から継承していますMovieClip
。これは、より「具体的な」サブタイプであることを意味します。MovieClip
それ自体は から継承しSprite
、そのクラスからいくつかの作業を借りて、それ自体を拡張します。
実際、 a には継承の完全な階層がありMovieClip
ます。
MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object
Object
最も基本的なタイプはであることがわかります。これは、ほとんどすべてが ActionScript にあります。「ほぼ」はその文のキーワードです。
BlueBox
おそらく最も簡単な方法は、 との両方RedBox
が継承される親クラス (または基本クラス) を作成することです。この新しい親は、それらの間で共通のコードを保持し、その後RedBox
、それらBlueBox
の間で異なるコードのみを含みます。
たとえば、新しい基本クラスを見てみましょう。
public class AbstractBox extends MovieClip {
private var color:uint;
public function AbstractBox(color:uint) {
this.color = color;
this.addEventListener(MosueEvent.MOUSE_DOWN, handler)
redraw();
}
// Mouse handler
private function handler(e:MouseEvent):void {
trace("DOWN!");
}
// some internal work
private funciton redraw() {
this.graphics.clear();
this.graphics.beginFill(this.color);
this.graphics.drawRect(10,10,50,50);
}
// other methods.
}
このクラスAbstractBox
には以前と同じものがほとんど含まれていることに注意しMovieClip
てください。実際の唯一の違いは、そのコンストラクターが 1 つの引数 (四角形を描画するために使用する色) を受け入れることです。handler
redraw
redraw
では、 から何を削除できBlueBox
ますか? ほとんどすべて、見てみましょう:
public class BlueBox extends AbstractBox {
public function BlueBox(color:uint) {
super(0x0000ff)
}
}
BlueBox
が extendsになり、その実装のほとんどが削除されていることに注意してくださいAbstractBox
。具体的には、そのスーパーから借用されています。コンストラクター内で、「親」クラスのコンストラクターを呼び出し、使用する色を指定します。
を作成するRedBox
には、色を変更するだけです。
public class RedBox extends AbstractBox {
public function BlueBox(color:uint) {
super(0xff0000)
}
}
ほらね。両方に共通のコードはAbstractBox
、 にあり、次にRedBox
とBlueBox
は、その共通の祖先の特定の実装です。
これは、OOP に関して言えば氷山の一角にすぎません。学ぶべきことはまだたくさんあります。おそらくもっと重要なことですが、問題を解決するために継承を使用してはいけない場合について学ぶ必要があります。しかし、幸運なことに、これらのスキルを習得するためのリソースがインターネット上にたくさんあります。
あなたのコメントに基づいて、Flash UI からではなく actionscript からこれらの DisplayObjects を instat している限り、別のアプローチを試すことができます。サブクラスではなく、静的メソッドを使用してそれらを生成します。
public class AbstractBox extends MovieClip {
public static function createBlueBox():AbstractBox
{
return new AbstractBox(0x0000FF);
}
public static function createRedBox():AbstractBox
{
return new AbstractBox(0xFF0000);
}
private var color:uint;
public function AbstractBox(color:uint) {
this.color = color;
this.addEventListener(MosueEvent.MOUSE_DOWN, handler)
redraw();
}
// Mouse handler
private function handler(e:MouseEvent):void {
trace("DOWN!");
}
// some internal work
private funciton redraw() {
this.graphics.clear();
this.graphics.beginFill(this.color);
this.graphics.drawRect(10,10,50,50);
}
// other methods.
}
そして、次を使用してそれらを呼び出します。
var blue:AbstractBox = AbstractBox.createBlueBox();
var red:AbstractBox = AbstractBox.createRedBox();
Flash UI では、参照するクラスに継承チェーンとパラメーターなしのコンストラクターが必要です。そのため、クリップをそのようにリンクする場合は、子クラスを生成する必要があります。または、パラダイムを完全に変更し、コンストラクターに依存して問題のプロパティを設定/変更するのではなく、プロパティが設定されると、クリップ自体を再描画します。何かのようなもの:
public class AbstractBox extends MovieClip {
private var _color:uint;
public function get color():uint { return _color; }
public function set color(val:uint) {
_color = val;
redraw();
}
public function AbstractBox() {
this.addEventListener(MosueEvent.MOUSE_DOWN, handler)
redraw();
}
// Mouse handler
private function handler(e:MouseEvent):void {
trace("DOWN!");
}
// some internal work
private funciton redraw() {
this.graphics.clear();
this.graphics.beginFill(this.color);
this.graphics.drawRect(10,10,50,50);
}
// other methods.
}
.color
プロパティを設定すると、MovieClip 自体が再描画されることに注意してください。
redBox.color = 0xFF0000; // where redBox is an instance name of an AbstractBox in the Flash UI.
blueBox.color = 0x0000FF;