我主要是在Java工作,但最近我开始使用ActionScript 3.0开发一个多人Flash游戏,我正在帮助开发这个游戏。这个项目还处于早期阶段,所以我还在研究班级结构。当我尝试使用我期望在ActionScript中实现的许多OOP特性时,我一直受到语言的限制。
例如:
Character
类。没有理由要实例化Character
,但是ActionScript不支持抽象类。因此,我的代码在顶部有这样的注释:字符应该是一个抽象类,但不支持抽象类。 不要创建该类的实例。(仅实例化扩展此类的类(例如。(玩家,僵尸)
CharacterGroup
类和一个内部类Character
,这样一个CharacterGroup
也可以包含像枪支之类的其他精灵。在Java中,我将使用一个内部类。ActionScript不支持内部类。有一个叫做"helper类“的东西,但是helper类不是继承的,这使得它们在这个上下文中毫无用处。我的问题是: ActionScript处理OOP设计的能力是不够发达,还是觉得ActionScript如此令人沮丧,因为我试图把它写得像Java一样,而不是在思考ActionScript是如何设计的?
换句话说,在ActionScript中进行面向对象设计的“正确”方法与在Java中的不同吗?
(注意:我不是在询问为什么ActionScript比Java更好/更糟的原因。我只是问我的编码是否正确,还是试图从Java中汲取太多的经验。)
谢谢!
发布于 2010-11-13 02:15:18
AS3并不缺少特性,您不能将其定义为“欠开发”。
首先,针对您的问题,有一些方法可以绕过抽象类方法。对于抽象类字符,您可以使用它,这样用户开发人员在尝试实例化它时会收到一个错误。
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
中。
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
}
}
然后在任何时候使用它,您都可以在类级别实现它。
public class SQLite3 extends EngineBase implements IEngine
{
现在,我的SQLite3类必须有在IEngine
中定义的方法
我更喜欢编写具有定义函数的类,这些类的函数在实现时会被重写。
AbstractBase.as
/**
* 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
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 -它是开源的,您可以阅读所有这些元素是如何通过遍历代码来管理的。
发布于 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语言支持泛型、内联函数、条件编译(等等)。每当我在写图书馆的时候我都会用到它。
https://stackoverflow.com/questions/4169774
复制