需要为一个类“扩展”ActionScript 中的各种类
Posted
技术标签:
【中文标题】需要为一个类“扩展”ActionScript 中的各种类【英文标题】:Need to 'extend' various classes in ActionScript for one class 【发布时间】:2012-10-22 14:24:09 【问题描述】:我有一个类需要使用 Sprite 类的图形方法,所以我使用 Sprite 扩展了该类。但是,我有自己的自定义类,第一个类也需要扩展以使用其中编写的属性和方法。
当然,我可以通过 Sprite 扩展我的自定义类,第一个类可以同时使用两者,但我的自定义类与 Sprite 无关,不应该扩展它。
我将如何使用自定义超类的属性和方法并在一个子类中使用 Sprite 类的图形属性?
我的简单例子:
我的自定义类名为 MovingObject.as 并包含两个变量和一些需要由子类继承的方法。 MovingObject 的目的是保存与其子类的速度和加速度有关的信息。
子类 'RaceCar' 是使用扩展 Sprite 给出的图形方法绘制的,但我需要从 MovingObject 扩展以允许 RaceCar 继承速度和加速度。
我被困在如何为 RaceCar 提供从 Sprite 和我的 MovingObject 类扩展的功能。
【问题讨论】:
【参考方案1】:如果您的第一个类需要添加到显示列表中,它几乎肯定应该扩展Sprite
。您如何使您的第二个自定义类的功能对其可用可能取决于该功能是什么(如果您可以给出简短的描述,它将使回答问题变得更加容易)。
但是,除了扩展(您已经排除)之外,我还可以想到另外两种方法:
-
为您的第一个类提供一个您的自定义类的实例,以通过 setter 或直接在您的第一个类中实例化自定义类来执行操作。这被称为composition。
将自定义类上的方法设为静态,以便您的第一个类可以调用它们而无需实例化它。这是一种通常用于utility type classes 的方法。
更新:
我认为在这种情况下您可能会不必要地使事情复杂化,除非您设想有 MovingObject
的子类,它们不会在屏幕上直观地呈现(这对我来说似乎不太可能)。如果不是,那么 MovingObject
扩展 Sprite
是完全有效的,实际上是通过移动功能来增强它,这形成了 RaceCar
(以及任何其他移动的可见对象)的基类。
【讨论】:
为更新干杯,它提供了一个可以理解的论点,说明为什么通过 Sprite 扩展 MovingObject 应该没问题。【参考方案2】:在 AS3 中不存在多重继承,但解决此问题的一个不错的模式如下:
您有Base
和 Extension
类,其中 Extension
必须同时扩展 Base
和 Sprite
。
将Base
设为接口,您当前的Base
类将成为该接口的默认实现,例如BaseImpl
。
使Extension
扩展Sprite
并实现Base
。
Base
的实现将通过聚合一个BaseImpl
实例来完成,这意味着它将所有Base
方法委托给一个包含的BaseImpl
实例。
例子:
interface Base
function hello():String;
class BaseImpl implements Base
public function hello():String
return "Hello";
class Extension extends Sprite implements Base
private var base:BaseImpl = new BaseImpl();
public function hello():String
return base.hello();
这样,Extension
会将Base
的所有功能委托给它包含的BaseImpl
实例。
顺便说一句,在 Flash API 本身中,有一个正是这种模式的示例:EventDispatcher
是 IEventDispatcher
的默认实现,因此其他类可以扩展 EventDispatcher
以外的类,并且仍然实现 @987654343 @通过聚合。
祝你好运!
【讨论】:
这很有帮助,因为我不知道如何使用接口。但是我需要继承属性和方法,但是从我目前所读的内容来看,接口只有方法。谢谢你向我介绍这个。以上是关于需要为一个类“扩展”ActionScript 中的各种类的主要内容,如果未能解决你的问题,请参考以下文章