我有一个类需要使用Sprite类的图形方法,所以我使用Sprite扩展了所有类。但是,我有自己的自定义类,第一类ALSO需要扩展,以使用其中编写的属性和方法。
当然我可以通过Sprite扩展我的自定义类,第一个类可以使用它们,但是我的自定义类与Sprite无关,不应该扩展它。
我如何使用自定义超类的属性和方法并在一个子类中使用Sprite类的图形属性?
我的简单示例:
我的自定义类名为MovingObject.as,包含两个变量和一些需要由子类继承的方法。 MovingObject的目的是保存与子类的速度和加速度相关的信息。
使用扩展Sprite给出的图形方法绘制子类'RaceCar',但我需要从MovingObject扩展,允许RaceCar继承速度和加速度。
我坚持认为如何为RaceCar提供从Sprite和我的MovingObject类扩展的功能。
答案 0 :(得分:1)
如果需要将第一个类添加到显示列表中,它几乎肯定会扩展Sprite
。如何使第二个自定义类的功能可用于它可能取决于该功能是什么(如果您可以给出一个简短的描述,它将使得回答问题更容易)。
然而,除了扩展(你已经排除了),我还可以考虑另外两种方法:
更新:
我认为在这种情况下你可能会使事情变得更加复杂,除非你设想MovingObject
的子类在屏幕上没有直观的表示(这对我来说似乎不太可能)。如果没有,MovingObject
扩展Sprite
完全有效,实际上是通过移动功能扩充它,这形成了RaceCar
(以及任何其他移动的可见对象)的基类
答案 1 :(得分:1)
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
的默认实现,因此其他类可以扩展{{1}以外的类并且仍然通过聚合实现EventDispatcher
。