1

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

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

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


我的简单例子:

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

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

我被困在如何为 RaceCar 提供从 Sprite 和我的 MovingObject 类扩展的功能。

4

2 回答 2

1

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

但是,除了扩展(您已经排除)之外,我还可以想到另外两种方法:

  1. 为您的第一个类提供一个自定义类的实例,以通过设置器或直接在您的第一个类中实例化自定义类来执行操作。这称为组合
  2. 将自定义类上的方法设为静态,以便您的第一个类可以调用它们而无需实例化它。这是一种通常用于实用程序类型类的方法。

更新:

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

于 2012-11-02T00:30:43.213 回答
1

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

  • 您有类Baseand Extension,其中Extension必须同时扩展Baseand 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会将所有功能委托BaseBaseImpl它包含的实例。

顺便说一句,在 Flash API 本身中,有一个正是这种模式的示例:EventDispatcher是 的默认实现IEventDispatcher,因此其他类可以扩展一个类,而不是通过聚合来EventDispatcher实现。IEventDispatcher

祝你好运!

于 2012-11-02T01:25:13.623 回答