2015-07-19 93 views
1

我正在學習AS3,但在編程(TP和Atari Basic)中有一些陳舊的背景。在這個論壇上,我學會了使用如下面的循環來解決對象類中的每個變量,以便對對象(深度或淺度)進行克隆,或者在我的情況下爲工具提示構建文本。不過,我的行不通。這是循環,下面是一個解釋,任何幫助,你可以給我很欣賞!無功能「for循環」用於尋址每個變量的類

var tooltipText:String; 
var i:String; 
for (i in bsm) { 
    if (!(bsm[i] is String)) { 
     if (bsm[i] != 0) { 
      tooltipText = i + ": " + bsm[i]; 
      tooltip.extendTooltip(tooltipText, 0xFFFFFF); 
     } 
    } 
} 

請原諒可怕的變量名稱。 '我'是一個字符串。 「BSM」是類StatMod,這與

public class StatMod extends Object { 
    public static const ENCHANTMENTMODIFIER:String = "enchantmentModifier"; 
    public var enchantmentType:String = "None"; 
    public var enchantmentDescriptor:String = "None"; 
    public var minDamage:Number = 0; 
    public var maxDamage:Number = 0; 
    public var attackSpeed:Number = 0.2; 

預期的行爲是要經過各StatMod的變量(開頭的非空實例,我沒有顯示所有這些,我會添加更多),如果變量是非零數字,則創建一個字符串(例如「attackSpeed:0.2」),然後將該字符串添加到工具提示中。 tooltip.extendTooltip函數正常工作。

觀察到的行爲基本上是計算機認爲bsm中沒有變量。

我能說些什麼或做什麼來說服電腦,實際上 variabels in bsm?

+0

相反從對象外部訪問屬性,向你的類添加一個方法,返回工具提示應該顯示的'String'。您可以重寫子類中的方法以獲得不同的行爲,但可以利用多態性。 – null

回答

0

您期待的行爲只是迭代動態附加屬性時的情況。例如,如果您標記您的dynamic類:

public dynamic class StatMod { } 

然後在運行時添加一些值吧:

bsm.test = 5; 

你的循環會找物業test與價值5

你要實現你想要的某些選項:

  • 擴展Proxy類來定義什麼樣的屬性通過nextNamenextNameIndex是可迭代。使用describeType生成所有公共屬性的列表。

雖然一個簡單的方法是暴露要遍歷屬性的列表,並使用在你的循環,而不是,是這樣的:

public class StatMod { 
    // Existing properties etc. 

    private _properties:Vector.<String>; 

    public function get properties():Vector.<String> { 
     if (_properties === null) { 
      _properties = new <String>[ 
       'enchantmentType', 
       'enchantmentDescription', 
       'minDamage', 
       'maxDamage', 
       'attackSpeed' 
      ]; 
     } 

     return _properties; 
    } 
} 

然後:

for (var i:int = 0; i < bsm.properties.length; i++) { 
    var prop:String = bsm.properties[i]; 
    trace(prop, bsm[prop]); 
} 
+0

謝謝你的迴應。我將不得不考慮變量名稱之前的下劃線。 (如果你願意解釋,很好,如果不是沒有問題,我確信我可以在網上找到一個很好的解釋。)我其實有一個改進,以推薦給任何人閱讀這個在未來。在我最初的代碼中,我打算瀏覽所有的屬性並只添加那些不是字符串的屬性。在此代碼之前,我爲Strings做了同樣的事情。我可以發送一個參數給上面的「properties()」函數來告訴它現在我想處理哪一組變量名。 –

+0

@DanH下劃線只是一個私有變量與getter或setter的通用約定:-) – Marty

+0

僅供參考,任何人閱讀本文,getters都可以沒有參數。也許我需要多個獲得者來獲得我期望的不同結果。 –