2013-10-17 68 views
0

我在AS3中開發遊戲。有一個武器超類,其中包含射擊和重裝等方法,這些方法在所有武器中表現相同。超類中的AS3方法,子類中的公共靜態變量

特殊武器,如手槍,霰彈槍繼承這個類,使他們可以使用這些方法。他們有公共的靜態變量,例如射擊的子彈類型,射速,子彈傳播,使它們獨一無二,並用於這些方法。他們需要是公共的靜態變量,所以我可以從核心的其他地方查看它們,當我到達那裏的時候就是被解僱的武器類型。

這是我應該怎麼做的嗎? Weapon超類如何訪問這些變量?

+0

我認爲'Interface'對於此設計來說是一個好方法。我必須相信,霰彈槍和手槍將需要特定的功能,因此應該在適當的班級進行處理。 – prototypical

+0

這裏有一個很好的鏈接,可以學習一個'Interface',很遺憾不能全部解釋。現在沒有時間詳細說明,但這會幫助您瞭解一個好方法 - > http://blog.shoguniphicus.com/2011/02/02/interface-in-as3-program-to-an -interface-not-an-implementation/ – prototypical

回答

0
public static const RATE:uint = 2; 

即由Weapon類或者作爲Weapon.RATE或作爲RATE訪問。當涉及到靜態對象時,範圍有點奇怪。我個人認爲你不應該只能使用RATE訪問靜態對象,但它可以工作。

子類不要繼承靜態屬性和方法。它們完全屬於它們創建的類(如果你知道靜態對象的真實含義,這是有意義的)。因此,對於所有類別,即使是延伸Weapon的類別,都必須通過Weapon.RATE訪問public static對象。

但是我注意到了一個奇怪的現象。如果使用protected訪問修飾符而不是public,那麼類可以通過RATE訪問其超類中的靜態對象,就好像它是在類本身內創建的一樣。我不知道這背後的邏輯,但它的工作原理。

所以:

public class Weapon { 
    protected var RATE:uint = 2; 
    public var RATE2:uint = 5; 
} 

public class Gun extends Weapon { 
    trace(RATE); // output 2 
    trace(Weapon.RATE); // output 2 
    trace(RATE2); // output Error, access of undefined property 
    trace(Weapon.RATE2); // output 5 
} 

編輯:針對第一個註釋:

超工作的方式,擴展一個類可以訪問所有的公共和保護對象的超對象類。

所以我們可以說武器類是這樣的:

public class Weapon { 
    public function shoot():void{} 
    protected function reload():void{} 
    private function aim():void{} 
} 

您將訪問子類中的方法,就像你在超類本身將:

public class Pistol extends Weapon{ 
    public function Pistol() { 
     this.shoot(); // works 
     this.reload(); // works 
     this.aim(); // doesn't work because it is private 
    } 
} 

現在,如果你正在尋找進一步抽象事物,你可以在你的超類中設置屬性,使用受保護或公共修飾符,所有武器的默認值。在你的超類方法中,你只需調用這些值。在子類中,您將它們更改爲您需要它們的任何東西

public class Weapon { 
    public var rate:uint = 2; 

    public function shoot():void{ 
     // use this.rate here 
    } 
    protected function reload():void{} 
    private function aim():void{} 
} 

public class Pistol extends Weapon{ 
    public function Pistol() { 
     this.rate = 5; // value of rate is now 5 and will be used in shoot() 
     this.shoot(); // works 
     this.reload(); // works 
     this.aim(); // doesn't work because it is private 
    } 
} 
+0

嗨,謝謝你的迴應!我需要超類訪問子類中的變量,而不是相反。武器類有方法,手槍類有決定手槍應該如何表現的變量。但是當武器超類沒有在超類本身中定義時,它們如何訪問這些變量? –

+0

它的工作原理是,如果我在子類中定義了靜態變量,在超類中定義了它們的私有版本,並在子類構造函數中複製了值,那麼這樣做是否可行? –

+0

@JimSreven我完全誤讀你的問題。我道歉。我已經更新了我的答案。我認爲你應該避免在這種情況下使用靜態對象。您始終可以將靜態對象作爲參數傳遞給您的方法,但我認爲我提出的方法更簡潔,更易於使用/實現。 –

相關問題