【问题标题】:Calling member functions before constructor在构造函数之前调用成员函数
【发布时间】:2012-09-28 04:18:37
【问题描述】:

在 AS3 中,您可以通过调用成员函数来初始化成员变量(或常量)。这发生在调用构造函数之前。同时,'this' 关键字在初始化成员函数中是完全可访问的,即使尚未发出构造函数。

这听起来像是一个定时炸弹。任何人都可以评论上述做法吗?

编辑:

...
private var member:Sprite = getSprite(); // called before constructor
...
private function getSprite():Sprite {
    var spr:Sprite = new Sprite();
    this.addChild(spr); // 'this' used before constructor
    return spr;
}

【问题讨论】:

  • 你能发布一些代码来说明你的意思吗?
  • 我猜你在同一个类中有两个代码块。试试这个,你会意识到,创建一个名为 GetSprite 的新类,它的构造函数中没有任何代码,然后有一个函数 getSprite 并从另一个类访问 getSprite 函数,然后你就会明白这个悖论在你的问题中。
  • 您是否尝试过在实例化之前访问spr 变量的任何Sprite 属性?

标签: actionscript-3 flash constructor initialization member-functions


【解决方案1】:

据我了解,这很好(如果不是真的很好和可读)。调用 new 时会发生什么:

  1. 为实例分配内存(this 可用)
  2. 所有成员都被初始化(无论是默认的还是指定的)
  3. 构造函数被调用
  4. new 返回this

危险在于您必须确保getSprite() 中的任何内容都不需要在构造函数中初始化的内容(包括父构造函数,如果它被调用)。我会避免它,而只是初始化构造函数中的所有内容。

【讨论】:

    【解决方案2】:

    你真的无法做到你所说的。如果尚未构造实例,您可能无法访问实例上的非静态方法。至于 Jonatan 关于构造函数调用 super 的评论,如果您不在构造函数主体中调用 super(),它会自动发生在方法的顶部,这是隐式完成的。当您使用面向对象的语言构造对象时,您正在为类的所有成员分配内存。

    如果你说:

    var myVar:MyObject;
    myVar.doSomething(); //this line creates a null pointer exception because myVar is null
    

    如果你要说:

    var myVar:MyObject = MyObject.createInstance(); // assuming createInstance is a static method that returns an instance of MyObject
    myVar.doSomething(); //assuming createInstance() didn't return null then this works
    

    但在第二种情况下,您不能从静态方法 createInstance() 中引用“this”关键字。

    如果你展示了一个完整的例子来反驳我所说的,那么我会运行它并删除我的帖子,但我很确定我就在这里。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2011-12-07
      • 2015-08-05
      相关资源
      最近更新 更多