我有一个与 Flash、actionscript 3 相关的 OOP 问题。这是一个个人项目,我正在寻找解决此问题的设计模式或解决方法,我的目标是学习新东西。
我创建了一个名为 Chain 的类。我创建这个 util 类是为了使延迟函数调用变得容易。您可以通过以毫秒为单位的延迟添加函数来创建函数链。该链可以执行多次,甚至可以以相反的顺序执行。该类具有返回自身的函数。这使得 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。我正在尝试将事情分开,以保留 Chain 的一些核心功能,并让 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 实例,但这不允许我重写函数,然后我应该将很多属性设为公共而不是受保护,这也不是首选。
这可能吗?有人对此有很好的解决方案吗?