OOP 问题:扩展类、覆盖函数和类似 jQuery 的语法

2024-01-01

我有一个与 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 实例,但这不允许我重写函数,然后我应该将很多属性设为公共而不是受保护,这也不是首选。

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


这个问题很常见。您正在使用的设计模式称为流畅的界面 http://en.wikipedia.org/wiki/Fluent_interface如果你用谷歌搜索“Fluent Interface Inheritance”,你会发现很多问题,但答案却很少。

C#、Java 中解决该问题的常用方法C++就是使用模板 https://stackoverflow.com/questions/1041342/fluent-interfaces-and-inheritance-in-c。但是,我不知道如何在 AS3 中实现相同的功能,我发现这个话题 https://stackoverflow.com/questions/1578255/templates-for-as3-like-c这可能对你有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OOP 问题:扩展类、覆盖函数和类似 jQuery 的语法 的相关文章

  • 在关系数据库中存储树结构的已知方法有哪些? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Flash 图表和图形的最佳解决方案是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道融合图表 http www fusioncharts com 还有其他好的解决方案或 API 用
  • 覆盖Java中的属性[重复]

    这个问题在这里已经有答案了 在 Java 中 我最近有几个项目 我使用了这样的设计模式 public abstract class A public abstract int getProperty public class B exten
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • 发布者-订阅者与观察者[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C# 中加密并在 Flex 中解密

    我需要解密 Flex 中的一些数据 这些数据是用 C 加密并写入文件的 为了简单起见 我选择使用 as3crypto As3 库和 Bruce Schneier C 库 AS3 as3加密链接 http code google com p
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 在 ActionScript 3 中在形状上绘制文本

    有没有办法仅使用 ActionScript 在 DisplayObject 或 Shape 中绘制文本 我在网上找到的唯一方法是创建 TextField 但我无法将 TF 添加到 DisplayObject 或 Shape Edit 解决了
  • 检查一个类是否是另一个类的子类

    我想在不创建实例的情况下检查一个类是否是另一个类的子类 我有一个类 它接收类名作为参数 作为验证过程的一部分 我想检查它是否属于特定的类系列 以防止安全问题等 有什么好的方法可以做到这一点吗 is subclass of http php
  • 将数组从 Flash (AS3) 发送到 JavaScript

    是否可以使用ExternalInterface 调用将数组从Flash AS3 发送到JavaScript 我目前正在 Flash 内的 foreach 循环中多次调用一个函数 但速度太快 JavaScript 无法跟上 我的想法是创建一个
  • 检查 Objective-C 块类型?

    这主要是出于好奇 我不太确定它的实际用途是什么 但就这样吧 由于块也是 Objective C 对象 是否可以检查它们的类型 也就是说 它是否响应isKindOfClass 消息以及如何使用该消息来处理块 我天真的以为事情大概是这样的 vo
  • Javascript:我应该隐藏我的实现吗?

    作为一名 C 程序员 我有一个习惯 将可以而且应该私有的东西设为私有 当 JS 类型向我公开其所有私有部分时 我总是有一种奇怪的感觉 而且这种感觉并没有被 唤起 假设我有一个类型draw方法 内部调用drawBackground and d
  • 使用元类的 __call__ 方法而不是 __new__?

    在讨论元类时 the docs http docs python org reference datamodel html state 您当然也可以重写其他类方法 或添加新的 方法 例如定义一个自定义 call 方法中的 元类允许在调用类时
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 收到警告“标头不能包含多个标头,检测到新行”

    我正在用 oops 进行编码 以便用 PHP 上传图像 但是提交图片后却出现警告 标题不能包含多个标题 检测到新行 下面是我的函数 它给出了错误 public function ft redirect query if REQUEST UR
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 在方法内部执行方法

    我目前正在 FreeCodeCamp 中进行 JavaScript 练习 我的代码应该使用的测试用例之一是函数调用 如下所示 addTogether 2 3 这是我得到的基本功能 function addTogether return 当我
  • 舞台强制渲染/重绘

    通常我会监听 ENTER FRAME 事件并在每次渲染帧时执行代码 但是对于我的应用程序来说这太慢了 2 个 ENTER FRAME 事件之间的时间间隔为 40 毫秒 如果我改变帧率也没关系 那么是否可以在不监听事件的情况下强制Flash重
  • Youtube as3 API 似乎不再起作用

    我正在使用 as3 Youtube 官方 API 我需要在 swf 文件中加载 API 播放器 我已经在几个项目上完成了 一切都很好 但几个小时后 我的所有项目现在都坏了 这是崩溃的代码片段 Security allowDomain www

随机推荐