0

私のライブラリには、blueBox() コンストラクター、いくつかの変数、および MOUSE_DOWN イベントを処理する関数を保持する対応するクラス blueBox.as を持つ、blueBox という名前の movieClip があります。blueBox.as とほぼ同じクラスを必要とする redBox という movieClip もあります。コンストラクターの名前と変数の値のみを手動で変更せずに redBox.as として保存して、blueBox.as を複製することは可能ですか? 今のところ手動で行うことは大きな問題ではありませんが、このプロジェクトが成長するにつれて、意味のない量のファイルが作成され、すべて同じ情報が含まれます。これは少し冗長に思えます。洞察を歓迎します。

4

2 に答える 2

0

さまざまな種類のムービークリップを表示できるBoxクラスが必要なようです。そのクラスを取得したら、それぞれが異なるムービークリップ(redBox、blueBoxなど)を使用して、そのクラスの複数のインスタンスを作成できます。

于 2012-07-25T14:30:20.970 に答える
0

これは、継承を使用することで解決できます。これは、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 つの引数 (四角形を描画するために使用する色) を受け入れることです。handlerredrawredraw

では、 から何を削除でき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、 にあり、次にRedBoxBlueBoxは、その共通の祖先の特定の実装です。

これは、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;
于 2012-07-25T15:30:32.750 に答える