我有一个与 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 的类。我正在尝试拆分事物以使 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 的实例,但这不允许我覆盖函数,然后我应该将许多属性设为 public 而不是 protected,这也不是首选。
这可能吗?有人对此有很好的解决方案吗?