2012-11-01 42 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