Flash、actionscript 3 で OOP 関連の問題があります。これは個人的なプロジェクトであり、この問題のデザイン パターンまたは回避策を探しています。私の目標は、新しいことを学ぶことです。
Chainというクラスを作成しました。遅延関数呼び出しを簡単にするために、この util-class を作成しました。ミリ秒単位の遅延で関数を追加することで、一連の関数を作成できます。このチェーンは、逆の順序であっても、複数回実行できます。このクラスには、自分自身を返す関数があります。これにより、次のような jQuery スタイルの構文を使用できるようになります。
var chain:Chain = new Chain();
chain.wait(100).add(myFunction1,300).wait(300).add(myFunction2,100);
// etc..
この例では、問題を示すためだけに多くの関数を残しました。Chain クラスは、ほとんどの場合、関数を追加してチェーンを開始/停止するためのものです。
public class Chain
{
function wait(delay:int = 0):Chain
{
// do stuff
return this;
}
public function add(func:Function, delay:Number = 0):Chain
{
list.push( new ChainItem(func, delay) );
return this;
}
}
今、ChainTween という別のクラスがあります。いくつかのコア機能を備えたチェーンを維持し、ChainTween にいくつかのアニメーションのトリックを実行させるために、物事を分割しようとしています。私は、Chain クラスに基づいて小さなトゥイーン エンジンを作成するというアイデアを思いつきました。現在、Chain を拡張しています。Chain クラスからの保護された変数を多数使用し、Chain のいくつかのコア関数もオーバーライドして、Chain のプロセス内にトゥイーン関数を追加します。
public class ChainTween extends Chain
{
function animate(properties:Object = null, duration:Number = 0, easing:Function = null):ChainTween
{
// do stuff
return this;
}
}
これが問題です。連鎖構文を維持したいのですが、wait() は Chain インスタンスを返し、Chain にはアニメーション関数がありません。
var chain:ChainTween = new ChainTween();
chain.wait(100).animate({x:200}, 100).wait(250);
ChainTween クラスの wait() および add() 関数をオーバーライドしようとしましたが、互換性のないオーバーライドが発生します。
chain.wait(100) を ChainTween としてキャストすることもできますが、これは非常に見苦しく、多数のチェーンを使用する場合には役に立ちません。ここで、ChainTween 関数を Chain に追加したくありません (ダミー関数もありません)。また、すべての関数の補完を保持したいので、Object を返すこともできません。インターフェイスを使用しようとしましたが、インターフェイスの関数はそれを実装するクラスに実装する必要があるため、これも同じ問題を引き起こします。
ここで、ChainTween 内に Chain のインスタンスを作成することを考えましたが、これでは関数をオーバーライドできないため、多くのプロパティを保護する代わりに公開する必要がありますが、これも好ましくありません。
これは可能ですか?これに対する優れた解決策はありますか?