flash - OOP 问题 : Extending a class, 覆盖函数和类似 jQuery 的语法

标签 flash actionscript-3 oop design-patterns fluent-interface

我有一个与 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 类的小 tweenengine 的想法。目前它扩展了 Chain。它使用了 Chain 类中的大量 protected 变量,并重写了 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 也不是一个选项。我尝试使用接口(interface),但这会产生同样的问题,因为接口(interface)的功能应该在实现它的类中实现。

现在我考虑过在 ChainTween 中创建一个 Chain 实例,但这不允许我重写函数,然后我应该将许多属性设为 public 而不是 protected,这也不是首选。

这可能吗?有人对此有很好的解决方案吗?

最佳答案

这个问题很常见。您使用的设计模式称为 Fluent Interface如果你用谷歌搜索“Fluent Interface Inheritance”,你会发现很多问题和很少的答案。

在 C#、Java 和 C++ is to use templates 中解决它的常用方法.但是,我不知道如何在 AS3 中实现相同的功能,我找到了 this topic那可能对你有帮助。

关于flash - OOP 问题 : Extending a class, 覆盖函数和类似 jQuery 的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4469400/

相关文章:

actionscript-3 - Flash CS6 AS3仅在一帧上播放声音,在左帧时停止播放

flash - 延长/续订 p12 自签名证书已过期

apache-flex - 条件编译 "else"

arrays - 当像素阵列为小型可编辑文本 AS3 时,未生成 8 位 BMP 图像

c++ - 发送类实例时是否会调用覆盖,就好像它是没有覆盖的类型一样?

java - 作为方法的结果返回对象

flash - 如何实现我自己的 Cirrus(以前称为 Stratus)服务器?

apache-flex - 检查对象是否为空

javascript - 我在游戏中的类(class)应该有多具体? (或其他任何地方)

ruby - TCP套接字停止接收数据直到关闭