我的问题直接涉及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如何是一种糟糕的面向对象语言的另一个例子?
答案 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);
}