我在AS3中開發遊戲。有一個武器超類,其中包含射擊和重裝等方法,這些方法在所有武器中表現相同。超類中的AS3方法,子類中的公共靜態變量
特殊武器,如手槍,霰彈槍繼承這個類,使他們可以使用這些方法。他們有公共的靜態變量,例如射擊的子彈類型,射速,子彈傳播,使它們獨一無二,並用於這些方法。他們需要是公共的靜態變量,所以我可以從核心的其他地方查看它們,當我到達那裏的時候就是被解僱的武器類型。
這是我應該怎麼做的嗎? Weapon超類如何訪問這些變量?
我在AS3中開發遊戲。有一個武器超類,其中包含射擊和重裝等方法,這些方法在所有武器中表現相同。超類中的AS3方法,子類中的公共靜態變量
特殊武器,如手槍,霰彈槍繼承這個類,使他們可以使用這些方法。他們有公共的靜態變量,例如射擊的子彈類型,射速,子彈傳播,使它們獨一無二,並用於這些方法。他們需要是公共的靜態變量,所以我可以從核心的其他地方查看它們,當我到達那裏的時候就是被解僱的武器類型。
這是我應該怎麼做的嗎? Weapon超類如何訪問這些變量?
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
}
}
嗨,謝謝你的迴應!我需要超類訪問子類中的變量,而不是相反。武器類有方法,手槍類有決定手槍應該如何表現的變量。但是當武器超類沒有在超類本身中定義時,它們如何訪問這些變量? –
它的工作原理是,如果我在子類中定義了靜態變量,在超類中定義了它們的私有版本,並在子類構造函數中複製了值,那麼這樣做是否可行? –
@JimSreven我完全誤讀你的問題。我道歉。我已經更新了我的答案。我認爲你應該避免在這種情況下使用靜態對象。您始終可以將靜態對象作爲參數傳遞給您的方法,但我認爲我提出的方法更簡潔,更易於使用/實現。 –
我認爲'Interface'對於此設計來說是一個好方法。我必須相信,霰彈槍和手槍將需要特定的功能,因此應該在適當的班級進行處理。 – prototypical
這裏有一個很好的鏈接,可以學習一個'Interface',很遺憾不能全部解釋。現在沒有時間詳細說明,但這會幫助您瞭解一個好方法 - > http://blog.shoguniphicus.com/2011/02/02/interface-in-as3-program-to-an -interface-not-an-implementation/ – prototypical