【问题标题】:ActionScript check not initialized field classActionScript 检查未初始化的字段类
【发布时间】:2014-02-15 17:28:11
【问题描述】:
class Test
{
    public var field1:SomeClass;
    public var field2:SomeClass = new SomeClass();
}

class Main
{
var test:Test = new Test();
    public static function start(){
        if(Test.field1 is SomeClass)
        {
            trace("yay!");
        }
        else if(Test.field1 is null)
        {
            trace("boo");
        }
        else
        {
            trace("None of those");
        }

        if(Test.field2 is SomeClass)
        {
            trace("yay!");
        }
        else if(Test.field2 is null)
        {
            trace("boo");
        }
        else
        {
            trace("None of those");
        }
    }   
}

大家好,在上面的例子中是 Main.start();会返回嘘声和耶!分别,这意味着在初始化之前无法知道字段的类型是什么。问题是: 1)有没有办法解决这个问题? 2)也许可以做一些像 new Test.field1 这样的事情,从而用预期的类初始化它而不指定实际的类?

【问题讨论】:

    标签: actionscript-3 class field instantiation


    【解决方案1】:

    如何不定义变量

    public var field1; // this is a loosely typed variable.
    public var field2:*; // this is an untyped variable.
    

    您可以使用* special type“当您想将类型检查推迟到运行时。您可以使用无类型属性或表达式来规避严格模式下的编译时类型检查。但是请注意,运行时类型检查无论您是否使用严格模式,都会出现赋值语句。"

    这与在对象或数组中隐式声明数据类型相同。

    var foo:Array = ["Apple", 123, true];
    

    如果你要追踪每一个的类型,你会看到:

    0:"Apple" (String)
    1:123 (Number)
    2:true (Boolean)
    

    每个数组值在添加到数组时是在运行时隐式定义的,而不是预定义的数据类型。


    如何知道什么类型的变量

    is 运算符的问题在于,比较将沿着继承链运行。如果你有一桶 Sprites、MovieClips、Objects 和 Arrays,你可能会想像这样的过滤器:

    function sortBucket(foo:*):void {
        if (foo is Object) {
            // put it in the object bucket
        } else if (foo is Array) {
            // put it in the array bucket
        } else if (foo is Sprite) {
            // put it in the sprite bucket
        } else if (foo is MovieClip) {
            // put it in the MovieClip bucket
        }
    }
    

    您会发现所有foo 都会进入第一个条件,被过滤到您的“对象桶”中。这是因为所有ArraysSpritesMovieClips 都继承自Object,因此等于一。

    查看继承图...

    更精确的解决方案可能是使用getQualifiedClassName()。下面是我的解决方案:

    function getType(value:*):String {
        // Returns the type of object passed to it, as a string.
        var msg:String = flash.utils.getQualifiedClassName(value);
        if (msg.lastIndexOf("::") != -1) {msg = msg.split("::")[1];}
        return msg;
    }
    

    现在,当出现无类型变量时,getType() 将返回存储的隐式数据类型。这是修改后的桶分拣机(实际工作)...

    function sortBucket(foo:*):void {
        switch (getType(foo)) {
            case "Object":
                // put it in the object bucket
                break;
            case "Array":
                // put it in the array bucket
                break;
            case "Sprite":
                // put it in the sprite bucket
                break;
            case "MovieClip":
                // put it in the MovieClip bucket
                break;
        }
    }
    

    【讨论】:

    • 很抱歉,但这并不是我真正想要的。我确实想事先定义一个字段的类。问题出在后面的代码中,如果我没有明确地实例化它,我似乎无法知道我给了一个 var 什么类。如何得到耶!在这两种情况下,如果不更改 Test 类定义,这就是问题所在。
    • 添加了“如何知道什么类型的变量”。那应该回答“如何知道我给了什么类”
    • 我试过了,它在未初始化的对象上返回 null。仍然感谢您的帮助,我想我会在类声明时初始化所有变量。
    猜你喜欢
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多