gpt4 book ai didi

actionscript-3 - 从 Java 到 ActionScript 的类设计挫折

转载 作者:行者123 更新时间:2023-12-01 21:57:42 26 4
gpt4 key购买 nike

我主要使用 Java 工作,但最近我开始使用 ActionScript 3.0 来开发我正在帮助开发的多人 Flash 游戏。该项目还处于早期阶段,所以我仍在研究类结构。当我尝试使用 Java 中期望的许多 OOP 功能时,我不断遇到 ActionScript 语言的限制。

例如:

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

Character should be an abstract class, but AS doesn't support abstract classes.

DO NOT CREATE AN INSTANCE OF THIS CLASS. (Only instantiate classes that extend this one (ex. Player, Zombie))

  • 由于 Flixel(我们正在使用的库)的设计,我需要一个带有内部类 CharacterCharacterGroup 类,以便 >CharacterGroup 还可以包含其他 Sprite ,例如枪之类的。在 Java 中,我会使用内部类。 ActionScript 不支持内部类。有一种叫做“帮助程序类”的东西,但帮助程序类不是继承的,这使得它们在这种情况下毫无用处。

我的问题是:ActionScript 处理 OOP 设计的能力是否还不够成熟,或者我发现 ActionScript 如此令人沮丧,因为我试图像 Java 一样编写它,而不是思考 ActionScript 的设计方式?

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

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

谢谢!

最佳答案

AS3 并不缺少功能,您不能将其定义为“欠发达”。

首先针对您的问题 - 有多种方法可以解决抽象类方法。对于您的抽象类Character - 您可以这样做,以便用户开发人员在尝试实例化它时收到错误。

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 - 它是开源的,您可以阅读如何通过浏览代码来管理所有这些元素。

关于actionscript-3 - 从 Java 到 ActionScript 的类设计挫折,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4169774/

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