【问题标题】:AS3 TypeError: Error #1007: Instantiation attempted on a non-constructorAS3 TypeError: 错误 #1007: 在非构造函数上尝试实例化
【发布时间】:2012-06-16 03:00:17
【问题描述】:

由于某种原因,我无法让它工作(严重简化的代码失败):

package com.domain {
    public class SomeClass {
        private static var helper:Helper = new Helper();
    }
}

class Helper {
}

它可以编译,但在首次访问 SomeClass 时抛出:

TypeError: Error #1007: Instantiation attempted on a non-constructor.
    at com.domain::SomeClass$cinit()
    ...

【问题讨论】:

    标签: actionscript-3 static typeerror


    【解决方案1】:

    你需要生成一个构造函数并在类中声明你的变量,而不是函数:

    package com.domain { 
        public class SomeClass { 
            private static var helper:Helper 
            public function SomeClass() {
               helper = new Helper(); 
            }
        } 
    } 
    
    class Helper { 
    } 
    

    【讨论】:

    • 有趣...这似乎可行,尽管这种方法意味着您必须在静态成员 helper 可用之前实例化 SomeClass。此外,在实例构造函数中初始化静态成员有点奇怪。例如,如果您创建多个SomeClass 实例,则每次都会重置静态成员......不是您想要的。另一个例子,如果你有一个使用helper的静态方法,它会发现它是null直到你至少实例化SomeClass一次。至少可以说很奇怪。
    • 你不能在构造函数内部实例化。所以你不会在每次实例化 SomeClass 时都覆盖它。
    • 但是当你实例化 new Helper() 你调用类 Helper 的构造函数,这就是错误发生的地方。 Helper 没有构造函数?
    • @Wolv3r:如所写,您的示例将导致在 SomeClass 的每个新实例上创建一个新的 Helper,这对于静态变量肯定是不希望的。
    • 同意@Blanka,这很奇怪,也是一个真正的反模式,但是编译器喜欢它的原因是因为它有机会在调用其构造函数之前初始化Helper。 @Wolv3r,AS3 支持无参数构造函数的隐式定义和调用
    【解决方案2】:

    我认为它不能与同一文件中的 Helper 和 SomeClass 一起使用。 初始化 SomeClass 时,Helper 类还没有初始化,所以无法创建 Helper 对象。

    将 Helper 移动到单独的文件应该可以解决问题。

    【讨论】:

    • 他写道,这个例子是“严重简化的失败代码”。我想他把它放在两个分开的文件里。
    • 实际上,它们应该在同一个文件中。 @silyevsk,我认为这确实是初始化顺序问题。
    • 必须在同一个文件中,这就是您创建private constructor in Actionscript的方式
    【解决方案3】:

    non-constructor 错误是编译器笨拙的说法:“你已经为我还没有见过的类调用了构造函数”;如果它更聪明一点,它可以在抱怨之前检查文件(编译单元)中的内部类...... mehhh

    看到您已授予静态变量 private 访问权限,显然您打算仅在内部使用实例到 SomeClass假设;可以作为返回值传递出去)。

    以下解决方案将静态 var 的创建推迟到初始化内部类时,即调用(可能是隐式的)Helper.cinit() 时,而不是 Helper 时的 SomeClass.cinit() Helper 尚不存在 em>:

    package com.domain {
        public class SomeClass {
    
            public function doSomething(param:*):void {
                // ... use Helper.INSTANCE
            }
    
        }
    }
    
    class Helper {
        public static const INSTANCE:Helper = new Helper();
    }
    

    【讨论】:

      【解决方案4】:

      +1 给达伦。另一种选择是将Helper 类移动到文件顶部

      class Helper {
      }
      
      package com.domain {
          public class SomeClass {
              private static var helper:Helper = new Helper();
          }
      }
      

      【讨论】:

      • 不知道你能做到这一点。还没有机会测试,但如果它有效,就是这样。
      • 这很酷,我也不知道你能做到这一点。也就是说,对于我的特定用例,我仍然认为它不会起作用(我还没有测试它)...... Flex 编译器真的应该在编译任何东西之前解析整个文件
      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 2020-03-16
      相关资源
      最近更新 更多