需要在ActionScript中为一个类“扩展”各种类

时间:2012-11-01 22:35:56

标签: oop class inheritance actionscript extends

我有一个类需要使用Sprite类的图形方法,所以我使用Sprite扩展了所有类。但是,我有自己的自定义类,第一类ALSO需要扩展,以使用其中编写的属性和方法。

当然我可以通过Sprite扩展我的自定义类,第一个类可以使用它们,但是我的自定义类与Sprite无关,不应该扩展它。

我如何使用自定义超类的属性和方法并在一个子类中使用Sprite类的图形属性?


我的简单示例:

我的自定义类名为MovingObject.as,包含两个变量和一些需要由子类继承的方法。 MovingObject的目的是保存与子类的速度和加速度相关的信息。

使用扩展Sprite给出的图形方法绘制子类'RaceCar',但我需要从MovingObject扩展,允许RaceCar继承速度和加速度。

我坚持认为如何为RaceCar提供从Sprite和我的MovingObject类扩展的功能。

2 个答案:

答案 0 :(得分:1)

如果需要将第一个类添加到显示列表中,它几乎肯定会扩展Sprite。如何使第二个自定义类的功能可用于它可能取决于该功能是什么(如果您可以给出一个简短的描述,它将使得回答问题更容易)。

然而,除了扩展(你已经排除了),我还可以考虑另外两种方法:

  1. 为您的第一个类提供自定义类的实例,以便通过setter或直接在第一个类中实例化自定义类。这称为composition
  2. 使您的自定义类上的方法保持静态,以便第一个类可以调用它们而无需实例化它们。这是一种通常用于utility type classes的方法。
  3. 更新:

    我认为在这种情况下你可能会使事情变得更加复杂,除非你设想MovingObject的子类在屏幕上没有直观的表示(这对我来说似乎不太可能)。如果没有,MovingObject扩展Sprite完全有效,实际上是通过移动功能扩充它,这形成了RaceCar(以及任何其他移动的可见对象)的基类

答案 1 :(得分:1)

AS3中不存在多重继承,但解决此问题的一个不错的模式如下:

  • 您有课程BaseExtension,其中Extension必须同时延伸BaseSprite
  • 使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本身中,有一个确切的模式示例:EventDispatcherIEventDispatcher的默认实现,因此其他类可以扩展{{1}以外的类并且仍然通过聚合实现EventDispatcher

祝你好运!