2012-11-01 37 views
1

我有一个需要使用Sprite类的图形方法的类,所以我使用Sprite扩展了这个类。不过,我有我自己的自定义类,第一类ALSO需要扩展到使用内部写入的属性和方法。需要在一个类中为ActionScript'扩展'各个类

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

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


我简单的例子:

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

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

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

回答

1

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

然而,除了扩展(你已经排除了),我能想到的其他两种方法:

  1. 给你一流的自定义类的一个实例来作用于无论是通过一个setter或者直接在你的第一课中实例化自定义类。这被称为composition
  2. 使您的自定义类的方法为静态,以便它们可以由您的第一个类调用而不实例化。这是一种通常用于utility type classes的方法。

更新:

我想你可能不必在这种情况下复杂的事情,除非你设想具有MovingObject子类中没有视觉上的屏幕代表(这似乎不太可能对我来说)。如果不是这样,MovingObject扩展Sprite是完全有效的,实际上通过移动功能来扩充它,并且这形成了RaceCar(以及任何其他移动的可见对象)的基类。

+0

为更新而欢呼,它提供了一个可以理解的论点,为什么它应该可以通过Sprite扩展MovingObject。 – jaminscript

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的默认实现,让其他类可以扩展其他类比EventDispatcher,并且仍然实现IEventDispatcher通过汇聚。

祝你好运!

+0

这非常有帮助,因为我不知道如何使用接口。然而,我需要继承属性和方法,但从我迄今读过的接口只有方法。感谢您向我介绍这一点。 – jaminscript