冲突范围:同名的全局函数和类方法

时间:2011-07-06 15:46:18

标签: actionscript-3 function methods scope global

我的问题直接涉及ActionScript 3,尽管它可能会出现在其他语言中。

考虑AS3中的全局跟踪功能。调用该方法不需要导入,并且可以从所有类全局使用。

class A {

    public function A() {
        trace("Hello, A!"); // Hello, A!
    }

}

现在,如果我创建自己的同名类方法怎么办?在AS3中,如果我有一个类方法 trace ,然后在我的类的其他地方调用 trace ,则通过全局函数调用class方法。基本上,我已经阻止了调用全局跟踪方法的能力。

class B {

    public function B() {
        trace("Hello, B!"); // no output
    }

    public function trace(s:String):void {
        // do something else.
    }

}

现在,我知道显而易见的答案是,“不要创建一个名为 trace 的类方法。”但是如果我不知道全局 trace 函数的存在呢?或者,如果我想要“覆盖”或“阻止”全局功能,该怎么办?这样糟糕的编程吗?或者这只是AS3如何是一种糟糕的面向对象语言的另一个例子?

4 个答案:

答案 0 :(得分:2)

import flash.uitls。*;

然后你可以使用

(getDefinitionByName('trace') as Function)('Global trace.');

答案 1 :(得分:1)

如果您的功能trace不是public,您可以使用public namespace来调用原始功能:

class B {
    public function B() {
        // call the trace function that is defined in the public namespace
        public::trace("Hello, B!"); // output "Hello, B!"
    }

    // here the function is protected so not into the public namespace
    protected function trace(s:String):void {
        // do something else.
    }
}

答案 2 :(得分:0)

“但是,如果我不知道全局跟踪功能的存在会怎样?”

我更多地将此视为您在语言研究中尚未做过尽职调查的迹象,而不是语言本身的错误。 AS3中的顶级名称和关键字非常少,我认为如果您对学习某种语言感兴趣,至少应该熟悉这一顶级语言,这是公平的。

答案 3 :(得分:0)

另一种方法是更改​​名称绑定到全局标识符的位置,如下面的包装类:

class B {
    public function B() {
        Globals.global_trace("Hello, B!"); // delegates to global trace()
    }
    public function trace(s:String):void {
        // do something else.
    }
}

class Globals {
    public function global_trace(...args) {
        // class B's identifiers are now irrelevant for the name lookup
        trace.apply(null, args);
    }
}

更加本地化的方法是在隐藏全局符号之前重新绑定它:

private static var _trace:* = trace; // rebind global trace

public function trace(...args) {
    _trace.apply(null, args);
}