如何创建在 Flex 和 Flash 中可用的超类?

Posted

技术标签:

【中文标题】如何创建在 Flex 和 Flash 中可用的超类?【英文标题】:How can I make a superclass that is available in Flex and Flash? 【发布时间】:2011-06-21 14:05:23 【问题描述】:

我正在处理一个使用 Flash Professional 和 Flash Builder 的项目。美术团队在 Flash Pro 中创建资产并将项目发布为 SWC。然后我将 SWC 复制到我的 Flash Builder 项目的 lib 目录中,并通过它访问资产。

美术团队正在创作很多相同类型的东西;假设他们正在制作很多蜥蜴符号/组件。所有这些蜥蜴都有相似的动画(walk_left、walk_right 等),因此它们都在 ActionScript 中定义了与动画中的关键帧相关的常量(WALK_RIGHT_START、WALK_RIGHT_END 等)。

从 Flex 方面来说,无论我加载哪个 Lizard,我都希望能够告诉它向左走。所以我在 Flash Professional 中创建了一个超类,现在 Flash Professional 中蜥蜴的所有 AS 类都扩展了这个类 - Lizard.as

这一切都很好,但是当我想为我的蜥蜴添加更多复杂性时,我不想打开 Flash Pro 项目,编辑类,重新编译 SWC,将其发送回 Flex , 然后测试一下。我希望能够在 Flex 中编辑我的 Lizard 超类 - 所以我在 Flex 中创建了另一个超类:Lizard.mxml

在 Flex 中,每个蜥蜴组件(如 Gecko.mxml)当前都扩展了 Lizard.mxml,并且每个 包含 中定义的 AS 组件SWC(本例中为 Gecko.as)。

这看起来很复杂:一个扩展 mxml 超类的 mxml 组件,其中包含一个扩展 AS 超类的 AS 组件。

我想做的是在 Flex 项目中定义一个超类,让我的 Flash Pro 定义的组件扩展这个类(这是我认为不可能的部分),然后让我的 Flex 组件 (Gecko.mxml)扩展这些。

有什么办法吗?

【问题讨论】:

如果您只创建一个 AS3 类,您可以在 Flex 和 Flash 中使用它,并在这两个地方进行编辑。使用一些创意目录映射/库路径,您甚至可以在两个地方使用完全相同的文件。但是,如果您更改该类,您仍然需要重新编译。而不是扩展,我想知道组合是否对你更有效。有一个独立的类,每个人都使用。 【参考方案1】:

你不能改变一个类,你只能扩展它。

几年前,我从事一个项目,其中界面在 Flash 中完成并在 flex 编译器中编译。

我有不同的 ui 组件,它们由不同的类组成。但是对于我输入的逻辑,需要以同样的方式对待它们。这意味着所有类都必须具有相同的基类,而这必须是我自己的基类。因此 Button 和 List 都必须扩展 customUIClass。据我所知,这是您无法做到的(如果您正在阅读本文并知道方法,请告诉我)

我的解决方案是创建一个包装器。

适用于您的问题会是这样的

创建一个名为 Lizard(或动物、有机体等)的“超类”,它扩展了 MovieClip(或 casaMovieClip)。 蜥蜴会有一个变量private var _view:MovieClip 和一个初始化构造函数'init($type:MovieClip)`(不是实际的构造函数) _view=$type 和你添加视图 addChild(_view);

然后你会像这样创建你的动作

function walk():void
   _view.gotoAndPlay("WALK");
 

最后一件事是创建 Gecko 类,它将扩展 Lizard,并将其作为构造函数

function Gecko()
   init(new flaGecko());

如果你仍然需要重写任何函数,你可以这样做

或者你可以只创建var gecko:Lizard = new Lizard(new flaGecko());,但是你需要 init() 作为构造函数。

如需进一步阅读,请查阅装饰器设计模式。我发现AS3 design patterns book 很有帮助。

【讨论】:

如果您想修改 List 和 Button 以便它们从您自己的类之一扩展,您可以。基本上,如果您定义了一个与依赖项中定义的包结构相同的类,编译器将解析项目中的类,而不是依赖项中的类。因此,例如,如果您在应用程序中创建 mx.controls.Button 它可以做任何事情,当有人使用 mx.controls.Button 时,它将使用您的按钮类(尽管仍然没有多重扩展,因此您的基类需要从一个公共扩展您的案例的 List 和 Button 的超类)。 BTW cmets 并不是要使您的答案无效,并不能真正清楚地理解它的好坏。尽管我也同意 Flextras 的评论,即您应该能够使用通用的仅 AS3 类作为 Flex 和 Flash 中的基类。我通常发现在 Flex 中使用 AS3 编写基类总是一个好主意,只是为了更严格地控​​制子项的创建以及 MXML 在转换为 AS3 时隐含地为您做的其他事情。

以上是关于如何创建在 Flex 和 Flash 中可用的超类?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用休眠进行逆向工程以获取映射的超类

Adobe Flash Builder (flex4):addChild() 在此类中不可用。

如何在核心数据中以编程方式创建超类/子类?

如何让两个 NSManagedObject 类具有相同的超类

如何从别处调用 Objective-C 对象的超类的方法?

使用返回超类对象的超类方法 - Java