首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从Java到ActionScript的类设计挫折

从Java到ActionScript的类设计挫折
EN

Stack Overflow用户
提问于 2010-11-12 14:51:30
回答 2查看 484关注 0票数 4

我主要是在Java工作,但最近我开始使用ActionScript 3.0开发一个多人Flash游戏,我正在帮助开发这个游戏。这个项目还处于早期阶段,所以我还在研究班级结构。当我尝试使用我期望在ActionScript中实现的许多OOP特性时,我一直受到语言的限制。

例如:

  • 我需要一个抽象的Character类。没有理由要实例化Character,但是ActionScript不支持抽象类。因此,我的代码在顶部有这样的注释:

字符应该是一个抽象类,但不支持抽象类。 不要创建该类的实例。(仅实例化扩展此类的类(例如。(玩家,僵尸)

  • 由于Flixel (我们正在使用的库)的设计,我需要一个CharacterGroup类和一个内部类Character,这样一个CharacterGroup也可以包含像枪支之类的其他精灵。在Java中,我将使用一个内部类。ActionScript不支持内部类。有一个叫做"helper类“的东西,但是helper类不是继承的,这使得它们在这个上下文中毫无用处。

我的问题是: ActionScript处理OOP设计的能力是不够发达,还是觉得ActionScript如此令人沮丧,因为我试图把它写得像Java一样,而不是在思考ActionScript是如何设计的?

换句话说,在ActionScript中进行面向对象设计的“正确”方法与在Java中的不同吗?

(注意:我不是在询问为什么ActionScript比Java更好/更糟的原因。我只是问我的编码是否正确,还是试图从Java中汲取太多的经验。)

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-13 02:15:18

AS3并不缺少特性,您不能将其定义为“欠开发”。

首先,针对您的问题,有一些方法可以绕过抽象类方法。对于抽象类字符,您可以使用它,这样用户开发人员在尝试实例化它时会收到一个错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.strangemother.database.abstract
{ 

    public class CentralDispatch extends EventDispatcher
    {
        private static var _centralDispatch:CentralDispatch;


        public static function getInstance():CentralDispatch
        {
            if(!_centralDispatch)
                _centralDispatch = new CentralDispatch(SingletonLock);

            return _centralDispatch;

        }

        public function CentralDispatch(lock:Class)
        {
            if(!lock is SingletonLock)
            {
                throw new Error("CentralDispatch is a singleton. Use CentralDispatch.getInstance() to use.");
            }
        }

    }
}

internal class SingletonLock{}

正如您所看到的--这必须由'.getInstance方法‘使用--但是要扩展这个方法,只有这个类可以创建一个新的实例本身,作为它的唯一类可以看到内部类'SingletonLock{}’。出于您的目的,您可以删除'getInstance()‘方法,并强制用户以另一种方式接收该类的实例。

这也应该显示出创建内部类的能力。其他任何类都看不到它们--只有这个包和父类CentralDispatch才能使用它。

使用抽象函数方法的另一种方法是将其写入interface中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.strangemother.database.engines
{
    import com.strangemother.database.Model;
    import com.strangemother.database.ModelSchema;
    import com.strangemother.database.events.ModelEvent;

    public interface IEngine
    {
        /**
         * Reads modelSchema and calls generateModel upon
         * each model found.
         * */
        function generateModelSchema(modelSchema:ModelSchema=null):String

        /**
         * Generate your CREATE syntax model to output to your SQL
         * 
         * If you are extending the framework with your own database
         * engine, you must override this with your own model generation
         * format.
         * */
        function generateModel(model:Model):String

    }
}

然后在任何时候使用它,您都可以在类级别实现它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SQLite3 extends EngineBase implements IEngine
{

现在,我的SQLite3类必须有在IEngine中定义的方法

我更喜欢编写具有定义函数的类,这些类的函数在实现时会被重写。

AbstractBase.as

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
         * connect to the database. This is not usually
         * required as the abstraction layer should
         * automatically connect when required.
         * */
        public function connect(onComplete:Function=null):void
        {

SQLite3在某一点上扩展了AbstractionBase

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
overide public function connect(onComplete:Function=null):void

现在反驳@Allan关于它不发达的评论(对不起,老兄)

没有操作符重载--这是正确的,但Java也是如此。它不是用来确保AS3是可读的。

函数重载-您不能硬输入它,但是您可以让function makeTea(...args)传入任意多或少的数据。你也有getter/setter。

对于内联函数,可以创建匿名函数。

var myFunction:Function = Function(name:String):String{ return name + ' - rocks!'; }

您有动态类,因此类级重载-

真正代码的一个很好的例子是Flex Lib -它是开源的,您可以阅读所有这些元素是如何通过遍历代码来管理的。

票数 2
EN

Stack Overflow用户

发布于 2010-11-12 23:09:27

这有点主观,但就我个人而言,我认为在AS3中进行OO设计的“正确”方法与Java是一样的,AS3只是开发得较少。

AS2在很大程度上是基于原型的,就像目前的JavaScript一样,尽管有了JavaScript,你仍然可以对它进行编程,使其符合古典风格。然后,AS3出现了,它基于ECMAScript版本4的草稿。对ECMAScript的更新使它变得更加经典,类似于Java (JavaScript 2将以它为基础,但由于委员会成员认为变化太大)。因此,正如您已经发现的那样,尽管AS3现在是一种更经典的Java风格语言,但它对语言特性很有帮助。从我的头顶上看,它缺少了这样的东西:

  • 操作者超载
  • 功能过载
  • 仿制药
  • 抽象类
  • 内联函数
  • 你指出的内部类

可能还有很多其他语言我不知道的东西。不能够使用你习惯的语言特性是可以理解的,但大多数时候我已经学会了缺少的东西是奢侈品*。没有它们,您可以过得去--有时候,它会使您的代码变得更加危险和冗长,而这正是您必须学会使用的东西。

有一些黑客方式可以尝试模仿这些特性,但我很少费心。

*您也可以尝试查看语言哈克。代码被编译到LLVM到ABC字节码。Haxe语言支持泛型、内联函数、条件编译(等等)。每当我在写图书馆的时候我都会用到它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4169774

复制
相关文章
TS 从 0 到 1 - 类
通过 getter 和 setter 方法来实现数据的封装和有效性校验,防止出现异常数据。
Cellinlab
2023/05/17
2360
从 PHP 到 Java
前言 ---- 最近主要编程语言从 PHP 转到了 Java。这一个多月的经历对我很有意义,所以写文章记录一下。 编程语言各有侧重,它们之间的比较没什么意义,所以本文只写一下我对两种语言的看法,以及我转到另一种语言的经历,再分享一下最近学习 Java 的心得体会。 文章欢迎转载,请尊重作者劳动成果,带上原文链接:http://www.cnblogs.com/zhenbianshu/p/8510943.html 开始 ---- PHP 说来人生际遇无常,因为从小会几手 PS,直到大学,我的人生规划都是做一个平
枕边书
2018/03/30
2.3K0
Redux从设计到源码
本文主要讲述这三方面内容: Redux 背后的设计思想 源码分析以及自定义中间件 开发中的最佳实践 Redux背后的设计思想 在讲设计思想前,先简单讲下Redux是什么?我们为什么要用Redux?
美团技术团队
2018/03/12
1.4K0
Redux从设计到源码
从C#到TypeScript - 类
本文介绍了从C#到TypeScript - 类的基础知识,包括类的定义、构造函数、属性、方法、继承、多态、泛型、接口和抽象类。TypeScript还支持接口和抽象类,提供了许多类和接口的示例。此外,TypeScript还支持泛型,可以与接口和抽象类一起使用。这些概念都是JavaScript编程语言中比较高级的概念,需要有一定的编程基础才能理解。
用户1147588
2018/01/04
1.1K0
java从入门到精通_Java 入门到精通的过程
有读者留言说:“希望能写写前期阶段程序员的发展经历。” 收到这个问题后确实引发了我的一些回忆和思考,回想如果让我再重走一遍过来的路,在哪些方面还需要去改善呢?
全栈程序员站长
2022/09/08
1.7K0
ActionScript 3 中的as
每一种编程语言都提供强制类型转换,允许你将某一种数据类型转换成另一种数据类型,AS3自然也不例外。但是虽然我编写了不少Flex程序,对 AS3中的强制类型转换还是不太清楚,以前AS中是这样进行强制类型转换的:假设有一个类叫做Class1,我们声明了一个它的对象 c1,如果想要将它转换成Class2类型,只要这样写:
py3study
2020/01/07
5260
从陌生到熟练使用string类
其实size()和length()并没有本质区别. 都是用于返回string中字符串的有效字符长度. 但是,由于string实现的比较早,当时设计的是length(),后来STL出来以后,为了统一,增加了size()接口.
初阶牛
2023/10/14
1720
从陌生到熟练使用string类
《Java从入门到失业》第四章:类和对象(4.2):String类
       这一节,我们学习第一个类:String类。String翻译成汉语就是“字符串”,是字符的序列。我们知道,在Java中,默认采用Unicode字符集,因此字符串就是Unicode字符的序列。例如字符串“Java大失叔”,就是由7个Unicode字符‘J’、‘a’、‘v’、‘a’、‘大’、‘失’、‘叔’组成。在JDK中,把字符串抽象成一个类String提供给我们使用。String类在java.lang包中。
用户7801119
2020/09/27
4860
从0到1:轻松搞定从RPC到服务化框架的设计!
导语 | 目前互联网系统都是微服务化,那么就需要RPC调用,因此本文梳理了从RPC基本框架协议到整个服务化框架体系建设中所包含的知识点,重点在于RPC框架和服务治理能力的梳理。 一、从RPC到服务化框架设计 (一)RPC基本框架 理解RPC RPC就是远程过程调用。我们本地的函数调用,就是A方法调B方法,然后获取结果,RPC就是让你像本地函数调用一样进行跨服务的函数调用。我们现在都在讲微服务,服务都拆分为微服务了,那么相关依赖的调用,就会变成跨服务之间的调用,他们的通信方式就是依靠RPC。 RPC基础
腾讯云开发者
2021/11/19
7840
从代码到设计的性能优化指南
Tech 导读 性能对提高用户体验,保证系统可靠性,降低资源使用率,甚至增强市场竞争力等方面,都有着很大的影响,性能优化是程序开发过程中绕不过去一个课题。本文聚焦代码和设计两个方面,从CPU硬件到JVM容器,从缓存设计到数据预处理,全面的展现了性能优化的实施方向和落地细节,希望能启发您的思考,为您带来帮助。
京东技术
2023/08/22
1690
从代码到设计的性能优化指南
《Java从入门到失业》第四章:类和对象(4.6):类路径
       前面我们讨论过包,知道字节码文件最终都会被放到和包名相匹配的树状结构子目录中。例如上一节的例子:
用户7801119
2020/09/27
4090
Java从入门到放弃
1,http是什么(超文本传输协议)? hypertext transfer protocol由w3c制订的一种网络应用层协议,它规定了浏览器与web服务器之间如何通信以及通信所使用的数据格式。 (1
企鹅号小编
2018/02/08
9440
Java从入门到放弃
从Groovy到Java性能
在去年年初换过工作开始专注做性能测试,其中有一项很大的挑战就是FunTester测试框架性能是否可以支撑公司现在的业务。之前有文章分享过如何突破职业瓶颈,其中讲到如何负责服务的QPS上升一个数量级是一个非常大的挑战。最近在这个问题上,我有了一些新的发现,分享一下自己对FunTester测试框架使用的Java+Groovy这对组合性能方面的认识。
FunTester
2022/05/17
1K0
flash,flex,actionscript的关系
Macromedia Flash是强大的矢量动画编辑工具,在做动画起家之后,Flash一直在谋求rich internet application(ria富客户端)的霸主地位,最有影响的是,已经推出了面向对象的编程脚本ActionScript3.0,并且建立起类似于java swing的类库和相应component(组件)。Flex是通过java或者.net等非Flash途径,解释.mxml文件组织components,并生成相应得.swf文件。Flex的component和flash的component很相似,但是有所改进增强。目前Macromedia公司已经被ADOBE公司收购。当前(2008年10月)的flex版本为3.0 。   运用Flash是完全可以做到flex的效果的,为什么还需要flex呢?这里面有两个原因:1:为了迎合更多的developers(开发者)。Flash天生是为了designer(设计者)设计的,界面还有flash的动画概念和程序开发人员格格不入,为了吸引更多的jsp/asp/php等程序员,Macromedia推出了Flex,用非常简单的.mxml来描述界面给jsp/asp/php程序人员使用.(x/d)html非常相似,而且mxml更加规范化、标准化。   2,为了一个标准。你可能听说过微软下一代系统longhorn,在longhorn推出的同时微软也会推出新的语言xaml,一种界面描述语言,与之相应的就是smart client和flex非常相似的东西。Mxml和Xaml的也很相似… …这是人机交互技术的进步的重要体现,即内部逻辑与外部界面交互相分离。   Flex和j2ee/.net其实没什么关系,Macromedia用java做出来个应用把flash的技术融合到J2EE里面,再用.net的技术做出来个.net应用把flash技术融合到.net里面去;应该说flex解决了J2EE里面和.net里面最繁琐的问题那就是web 客户端的问题。 Flex与Flash的关系 Flash并非只是一个单纯的矢量动画创作工具,而是一个凭借脚本语言ActionScript在功能和定位上不断演变的网络应用开发工具。早在Flash MX的时候就已经成为macroemdia 推广RIA战略的工具。但是毕竟Flash最初的定位是面向美工的矢量动画创作工具,并不适合传统的开发人员。于是Flex成为开发者们的首选。   Flex和Flash都以ActionScript作为其核心编程语言,并被编译成swf文件运行于Flashplayer虚拟机里。因此Flex也继承了Flash在表示层上先天性的美感、除了视觉上的舒适感外,还天生具备方便的矢量图形、动画和媒体处理接口。   虽然Flex和Flash有众多的相似点,但是不同之处仍然很多   1.尽管公用ActionScript,但是使用的库并不完全相同,更合适的说法是两者使用着两套具有极大“功能重叠”范围的库。   2.Flash偏向的是美工人员,所以更容易发挥特效处理的优势,Flex偏向开发人员,所以容易做出具有丰富交互功能的应用程序。   3.Flash只能以ActionScript脚本的形式开发(舞台被关联到一个称之为 document class的类里),另外舞台元素也是可以绑定脚本的,不过从软件工程的角度讲不建议这样用,Flex还可以使用称作mxml的标记语言来描述应用的外观和行为,mxml中可以直接嵌入ActionScript脚本。   4.由于第三点而造成的两者市场定位不同,Flex是面向企业级的网络应用程序,Flash则面向诸如平面动画、广告设计等多媒体展示程序。   5.借助Flash Lite这一移动设备上的Flashplayer,Flash可以开发移动应用,Flex则不行。   6.Flash的编程模型是基于时间轴的,Flex的则是基于窗体,虽然它运行在网页里。
用户4766018
2022/08/19
3600
如何从平面设计转行到UI设计?
时代的变迁,科技的进步,工具的发展,薪资的差距,促使许多人转行的原因,但平面与界面两者之间有着哪些的差异呢?如果,想要转行又该具备哪些条件呢?
奔跑的小鹿
2019/01/24
5270
如何从平面设计转行到UI设计?
从涂鸦到发布——理解API的设计过程
  英文原文:From Doodles to Delivery: An API Design Process   要想设计出可以正常运行的Web API,对基于web的应用的基本理解是一个良好的基础。但如果你的目标是创建出优秀的API,那么仅凭这一点还远远不够。设计优秀的API是一个艰难的过程,如果它恰巧是你当前的工作任务,那么你很可能会感到手足无措。   不过,优秀的设计绝对是可以实现的。本文所描述的流程将帮助你获得成功,我们将共同研究什么是优秀的设计,以及迭代式的流程如何帮助我们实现这一目标。我们还将叙
逸鹏
2018/04/09
1.4K0
从涂鸦到发布——理解API的设计过程
微服务:从设计到部署【笔记】
一、微服务简介 A.单体地狱 1.成功的应用有一个趋势,随着时间推移而变得越来越臃肿 2.复杂的单体应用本身就是持续部署的障碍 3.单体应用使得采用新框架和语言变得非常困难 B.微服务 — 解决复杂问题 1.思路是将应用程序分解成一套较小的互连服务。一个服务通常实现了一组不同的特性或功能。每个微服务都是一个迷你应用,包括了业务逻辑以及多个适配器 2.一些微服务会暴露一个供其他微服务或应用客户端消费的API,其他微服务可能实现了一个WebUI,在运行时,每个实例通常是一个云虚拟机(virtual machine,VM)或者一个Docker容器 3.他们之间的通信是由一个被称为API网关(API Gateway)的中介负责,API网关负责负载均衡、缓存、访问控制、API计量和监控 4.如果您想从微服务中受益,每一个服务都应该有自己的数据库模式,因为它能实现松耦合 C.微服务的优点 1.解决了复杂问题,把可能会变得庞大的单体应用程序分解成一套服务 2.这种架构使得每个服务都可以由一个团队独立专注开发 3.微服务架构模式可以实现每一个微服务独立部署 4.微服务架构模式使得每个服务能够独立扩展 D.微服务的缺点 1.微服务这个术语的重点过多偏向于服务的规模,有些开发者主张构建极细粒度的10至100LOC(代码行)服务,但小型服务只是一种手段,目标在于充分分解应用程序以方便应用敏捷开发和部署 2.微服务是一个分布式系统,使得整体变得复杂,开发者需要选择和实现基于消息或者RPC的进程间通信机制,模块间通过语言级方法/过程调用相互调用,这比单体应用要复杂得多 3.分区数据库架构,需要更新不同服务所用的数据库,通常不会选择分布式事务,不仅仅是因为CAP定理 4.测试微服务应用程序也很复杂,需要启动该服务及其所依赖的所有服务,或者至少为这些服务配置存根 5.实现了跨越多服务变更,在微服务中需要仔细规划和协调出现的变更至每个服务 6.部署基于微服务的应用程序也是非常复杂的 7.每个服务都有多个运行时实例,还有更多的移动部件需要配置、部署、扩展和监控,还需要实现服务发现机制,使得服务能够发现需要与之通信的任何其他服务的位置(主机和端口),需要开发人员能高度控制部署方式和高度自动化 二、使用API网关 A.客户端与微服务直接通信 1.问题:客户端的需求与每个微服务暴露的细粒度的API不匹配,公网下效率低下 2.问题:有可能使用了非web友好协议,一个服务可能使用了Thrift二进制rpc,而另一个可能使用AMQP消息协议,这些对浏览器还是防火墙都是不友好的,最好是在内部使用 3.缺点:难以重构微服务 B.使用API网关 1.API网关是一个服务器,是系统的单入口点,类似于面向对象设计模式中的门面(Facade)模式,封装了内部系统架构,并针对每个客户端提供一个定制API,还可用于认证、监控、负载均衡、缓存和静态响应处理 2.API网关负责请求路由、组合和协议转换,通常会调用多个微服务和聚合结果来处理一个请求,可以在Web协议(如HTTP和WebSocket)和用于内部的非Web友好协议之间进行转换 3.API还可以为每个客户端提供一个定制API,通常为客户端暴露一个粗粒度的API C.API网关的优点与缺点 1.主要好处是它封装了应用程序的内部结构,客户端只与网关通信,而不必调用特定的服务 2.缺点是它是另一个高度可用的组件,需要开发、部署和管理,API网关可能会成为开发瓶颈 3.重要的是更新API网关的过程应尽可能地放缓一些,否则,开发人员将被迫排除等待网关更新 D.实施API网关 1.在一个支持异步、非阻塞I/O平台上构建API网关是很有必要的。Node.js、Nginx Plus 2.API网关通过简单地把他们(请求)路由到适当的后端服务来处理一些请求。它通过调用多个后端服务并聚合结果来处理其他请求,API网关应该并发执行独立请求 3.使用传统的异步回调方式来编写API组合代码会很快使您陷入回调地狱,好的方式是使用响应式方法以声明式编写API网关代码 4.一个基于微服务的应用程序是一个分布式系统,必须使用一个进程间(inter-process)通信机制,有两种方案:一是使用基于消息的异步机制,如JMS、AMQP、ZeroMQ等;另一种采用了同步机制,如HTTP和Thrift;API网关需要支持各种通信机制 5.API网关需要知道与其通论的每个微服务的位置(IP地址和端口),需要使得系统的服务发现机制:服务端发现或客户端发现,API网关必须能够查询服务注册中心,该注册中心是所有微服务实例及其位置的数据库 6.当一个服务调用另一个响应缓慢或不可用的服务时,API网关不应该无期限地等待下游服务,如何处理故障问题取决于决定的方案和哪些服务发生故障 7.如果可以,API网关还可以返回缓存数据,通过返回默认数据或缓存数据,确保系统发生故障
硬核项目经理
2019/08/06
7380
微服务:从设计到部署【笔记】
学习channel设计:从入门到放弃
通过开头的介绍我们可以知道channel是用于goroutine的数据通信,在Go中通过goroutine+channel的方式,可以简单、高效地解决并发问题。我们先来看一下简单的示例:
Golang梦工厂
2022/07/11
5530
学习channel设计:从入门到放弃
java从入门到精通三(java中的语句)
<>很简单,if条件语句是指如果满足某种条件,就进行某种处理,即执行满足条件的语句。不满足,就不执行相应的语句。
兰舟千帆
2022/07/16
6720
java从入门到精通三(java中的语句)
从设计到开发的完美交付(工具篇)
设计交付对于UI设计师来说是一项必要的工作流程,设计交付影响着界面的最终实现和各尺寸适配效果。那么如何做好从设计到开发的交付呢?本文就教一教大家,如何用工具帮助完成从设计到开发的完美交付。
奔跑的小鹿
2019/03/11
2K0
从设计到开发的完美交付(工具篇)

相似问题

设计模式挫折

66

Java布局挫折

44

从fla文件到actionscript 3.0中的类

10

如何从addEventListener到自定义actionscript类?

34

二进制搜索,从java到Actionscript

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文