【问题标题】:Nonfunctioning "for loop" for addressing each variable of class用于寻址类的每个变量的不起作用的“for循环”
【发布时间】:2015-07-19 21:38:34
【问题描述】:

我正在学习 AS3,但在编程(TP 和 Atari Basic)方面有一些过时的背景。在这个论坛上,我学会了使用如下循环来处理对象类中的每个变量,以便克隆对象(深或浅),或者在我的情况下为工具提示构建文本。但是我的不起作用。这是循环,以下是解释,您可以提供任何帮助,我将不胜感激!

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);
        }
    }
}

请原谅可怕的变量名。 'i' 是一个字符串。 '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 中没有变量。

我可以说什么或做什么来让计算机相信 bsm 中确实有个变量?

【问题讨论】:

  • 不要从对象外部访问属性,而是向您的类添加一个方法,该方法返回工具提示应显示的String。您可以在子类中重写该方法以获得不同的行为,同时利用多态性。

标签: actionscript-3 object for-loop


【解决方案1】:

只有在迭代动态附加属性时才会出现您所期望的行为。例如,如果您将班级标记为dynamic

public dynamic class StatMod { }

然后在运行时为其添加一些值:

bsm.test = 5;

您的循环将找到值为5 的属性test

你必须实现你想要的一些选项是:

  • 扩展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]);
}

【讨论】:

  • 感谢您的回复。我将不得不研究变量名前的下划线是什么意思。 (如果您愿意解释;很好,如果没有问题,我相信我可以在网上找到一个很好的解释。)实际上我对此有改进,可以推荐给将来阅读本文的任何人。在我的原始代码中,我打算遍历所有属性并仅添加那些不是字符串的属性。在这段代码之前,我对字符串做同样的事情。我可以向上面的“properties()”函数发送一个参数,告诉它我现在要处理哪组变量名。
  • @DanH 下划线只是带有 getter 或 setter 的私有变量的常见约定 :-)
  • 仅供阅读本文的任何人使用,getter 可以没有参数。也许我需要多个 getter 来获得我想要的不同结果集。
猜你喜欢
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多