【问题标题】:Is there a way to access entry point class object from other classes of the app?有没有办法从应用程序的其他类访问入口点类对象?
【发布时间】:2011-07-26 06:43:33
【问题描述】:

只是想知道我是否可以从应用程序的任何位置引用入口点对象?它是否可能分配给某个全局对象,例如舞台?

目前我使用静态方法和变量,但这会破坏封装。

【问题讨论】:

  • 您是指用于启动您的应用程序的 DocumentClass/"Main" 类吗?
  • 嗯...不知道如何命名。基本上是被标记为默认应用程序的那个。
  • 嗯..您有什么特殊需要吗?否则入口点只是一个常规对象,因此您可以像其他所有东西一样传递它。
  • 我知道我可以传递它。我只是想知道是否有捷径。

标签: actionscript-3 global entry-point


【解决方案1】:

如果someObject 在显示列表中,那么您有一个someObject.root 引用,这就是您要查找的内容。如果您从显示列表中删除 someObject,您将失去该引用。

我的回答是否定的,没有直接访问入口对象的方法,也不应该有:这就是封装的意义所在。在全球范围内访问某些东西几乎是 AS1 方式。当您通过隐式引用 MainClass 来访问主实例时,您会使应用程序的某些部分紧密耦合,这通常是不好的。

但是,如果您确实需要它,您可以从多个选项中进行选择。

  • 使用静态变量:MainClass.instance
  • 通过MainClass.getInstance() 使用类似单音的访问
  • 创建包级变量或包级 getter 方法

我会选择后者。

package com.smth.application 
{
    public var mainObject:MainClass;
} 

// in main app
package com.smth.application 
{
    public function MainClass()
    {
        mainObject = this;
    }
}

它可能看起来有点类似于静态访问,但我认为这样您的代码将保留一些灵活性。

【讨论】:

    【解决方案2】:

    stage 是对应用程序顶层的引用,您可以通过显示树上的任何显示对象以myDisplayObject.stage 访问它。使用自定义文档类时,它将是stage 的第一个子项(索引 0),除非您按照 Bakapii 的说明手动将其他内容强制到 0 索引中。

    【讨论】:

    • 实际上 DocumentClass 是stage 的第一个孩子,而不是stage 本身。这也仅在您第一次启动应用程序时才成立,因为可以执行类似 someClass.stage.addChildAt(someOtherClass, 0); 的操作
    • 谢谢,我不知道。我会修改的。
    • 这是root,而不是stage。您不需要依赖显示列表顺序。试试这个,例如:trace(stage.contains(root), getQualifiedClassName(root));。从添加到显示列表的任何显示对象中:trace(getQualifiedClassName(someObject.root));。但是,我认为这不能回答问题,因为 jayarjo 想从“应用程序中的任何位置”访问主对象。
    猜你喜欢
    • 2018-09-09
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2016-03-31
    • 2018-11-08
    • 1970-01-01
    相关资源
    最近更新 更多