gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:03:24 25 4
gpt4 key购买 nike

我有一个与 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com