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

从Java到ActionScript的类设计挫折
EN

Stack Overflow用户
提问于 2010-11-12 22: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 10:15:18

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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
运行
复制
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
运行
复制
public class SQLite3 extends EngineBase implements IEngine
{

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

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

AbstractBase.as

代码语言:javascript
代码运行次数:0
运行
复制
/**
         * 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
运行
复制
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-13 07: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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档