1

Spriteクラスのグラフィックメソッドを使用する必要があるクラスがあるので、Spriteを使用してそのクラスを拡張しました。ただし、私には独自のカスタムクラスがあり、その中に記述されたプロパティとメソッドを使用するために、最初のクラスも拡張する必要があります。

もちろん、カスタムクラスをSpriteで拡張することもでき、最初のクラスは両方を使用できますが、カスタムクラスはSpriteとは関係がないため、拡張しないでください。

カスタムスーパークラスのプロパティとメソッドを使用し、1つのサブクラスでSpriteクラスのグラフィックスプロパティを使用するにはどうすればよいですか?


私の簡単な例:

私のカスタムクラスはMovingObject.asという名前で、サブクラスに継承する必要のある2つの変数といくつかのメソッドが含まれています。MovingObjectの目的は、子クラスの速度と加速に関する情報を保持することです。

子クラス「RaceCar」は、Spriteを展開することによって与えられるグラフィックスメソッドを使用して描画されますが、RaceCarが速度と加速を継承できるようにMovingObjectから展開する必要があります。

私は、RaceCarにSpriteから拡張する機能と私のMovingObjectクラスの両方を提供する方法に固執しています。

4

2 に答える 2

1

ファーストクラスをディスプレイリストに追加する必要がある場合は、ほぼ確実に拡張する必要がありますSprite。2番目のカスタムクラスの機能をどのように利用できるようにするかは、おそらくその機能が何であるかによって異なります(簡単な説明を提供できれば、質問への回答がはるかに簡単になります)。

ただし、拡張機能(除外したもの)に加えて、次の2つの方法を考えることができます。

  1. セッターを介して、またはファーストクラスでカスタムクラスを直接インスタンス化することにより、ファーストクラスにカスタムクラスのインスタンスを提供します。これは構成として知られています。
  2. カスタムクラスのメソッドを静的にして、インスタンス化せずに最初のクラスから呼び出すことができるようにします。これは、ユーティリティタイプクラスに通常使用されるメソッドです。

アップデート:

この場合、サブクラスがMovingObject画面に視覚的に表示されないことを想定していない限り、不必要に物事を複雑にしている可能性があると思います(これは私にはありそうもないようです)。MovingObjectそうでない場合は、拡張することは完全に有効でSpriteあり、事実上、移動機能で拡張し、これにより、ユーザーRaceCar(およびその他の移動する可視オブジェクト)の基本クラスが形成されます。

于 2012-11-02T00:30:43.213 に答える
1

AS3には多重継承は存在しませんが、この問題に取り組むための1つの適切なパターンは次のとおりです。

  • クラスBaseExtensionがあります。ここで、との両方をExtension拡張する必要があります。BaseSprite
  • インターフェイスBaseを作成すると、現在のBaseクラスがそのインターフェイスのデフォルトの実装になりますBaseImpl
  • 拡張ExtensionSpriteて実装しBaseます。
  • の実装は、インスタンスBaseを集約することによって行われます。つまり、含まれているのインスタンスにすべてのメソッドをBaseImpl委任します。BaseBaseImpl

例:

interface Base {
    function hello():String;
}

class BaseImpl implements Base {
    public function hello():String {
        return "Hello";
    }
}

class Extension extends Sprite implements Base {

    private var base:BaseImpl = new BaseImpl();

    public function hello():String {
        return base.hello();
    }
}

このようにして、のすべての機能をそれが含むインスタンスにExtension委任します。BaseBaseImpl

ところで、Flash API自体には、まさにこのパターンの例があります。これEventDispatcherはのデフォルトの実装でIEventDispatcherあるため、他のクラスは他のクラスを拡張し、集約を通じてEventDispatcher実装することができます。IEventDispatcher

幸運を!

于 2012-11-02T01:25:13.623 に答える