2014-02-19 69 views
0

我想在if語句中使用@Type,但它好像不識別@Type。有沒有辦法獲得@Type以便我可以在超類中使用它?如何訪問Coffeescript擴展類中的屬性?

class opponent 
    constructor: (ID, Level, Name) -> 
     @ID = ID 
     @Level = Level 
     @Name = Name 
     @Health = if @Level is 1 
      @Level * 5 
     else if 2 <= @Level <= 4 
      (@Level * 6) - (@Level * 2) 
     @Luck = if @Type is "Snake" 
      Math.ceil(@Level * 1.25) + 5 
     else 
      Math.ceil(@Level * 1.25) 
     @attackDamage = 0 
     @defenseDoubled = false; 
     @Poisoned = false; 
     @Burned = false; 
     @Frozen = false; 

    @defend: -> 
     @Defense *= 2 
     @DefenseDoubled = true; 
    @undefend: -> 
     @Defense /= 2 
     @DefenseDoubled = false; 

class Snake extends opponent 
    @Type: "Snake" 
+1

爲什麼'Snake'沒有設置@ @ Health'本身?父類不應該知道任何可能的擴展。 – hpaulj

+0

@hpaulj我試圖避免這種情況,因爲我會製造更多的類從對手擴展,但我想這可能會更容易做到 – LukeK

+1

'@Type:「Snake」'line(借用Java術語)靜態變量。如果你希望它是非靜態的,你可以使用'Type:「Snake」'。你有沒有這樣做的理由? –

回答

1

這並不回答你的問題(如何使父類的子類屬性可見),但它應該產生相同的結果 - 以一種容易擴展的方式。您可以添加更多的子類,而無需每次都更改opponent

class opponent 
    constructor: (ID, Level, Name) -> 
     @ID = ID 
     @Level = Level 
     @Name = Name 
     @Health = if @Level is 1 
      @Level * 5 
     else if 2 <= @Level <= 4 
      (@Level * 6) - (@Level * 2) 
     @Luck = Math.ceil(@Level * 1.25) 
     @attackDamage = 0 
     # ... 

class Snake extends opponent 
    constructor : (ID, Level, Name) -> 
     # use parent constructor to create the object 
     # and then customize the values for this class 
     super 
     @Luck = Math.ceil(@Level * 1.25) + 5 
+0

爲了使它更加簡單和麪向未來,您可以在** opponent **類中實現@Luck計算,並且只在子類中定義某種* luck修飾符*,以便子類不必擔心關於運氣如何計算。 –

1

你可以到「類」使用constructor property

返回到創建實例的原型Object函數的引用。

因此,如果s是一條蛇,那麼s.constructorSnake。這意味着,你可以做這樣的事情:

class A 
    m: -> console.log(@constructor.type) 

class B extends A 
    @type = 'B' 

class C extends A 
    @type = 'C' 

(new B).m() 
(new C).m() 

,並在控制檯中'B''C'

演示:http://jsfiddle.net/ambiguous/bE6jh/

你的具體情況,你會想看看@constructor.Type想要知道類型的方法內。

0

您的代碼不會因爲在父類的工作,你所引用的實例變量,@Type,但在子類,你定義一個類變量,@Type: "Snake"

聲明Type變量,實例變量,聲明它沒有@標誌:

class Snake extends opponent 
    Type: "Snake" 

爲了進一步擴大hpaulj的answer - 你總是希望保持代碼的DRY,從而使計算邏輯@ Luck屬性應該只在父類中定義。考慮下面的例子:

class opponent 
    constructor: (args...) -> 
    # ... your logic 
    @Luck = Math.ceil(@Level * 1.25) + (@LuckFactor? or 0) 

class Snake extends opponent 
    LuckFactor: 5