概要
use
时如何在命名空间中声明变量陈述? (即,不使用变量名声明命名空间)trace(foo)
而不是 trace(a.foo)
[如果我必须在已经切换到命名空间后声明这一点,这似乎毫无意义])解释
阅读了格兰特·斯金纳的 "Complete Guide to Using Namespaces" ,以及其他文章,例如 Jackson Dustan 的 "Better OOP Through Namespaces" ,我留下了上述未回答的问题。我觉得好像我缺少一些基本原则,但我似乎无法让命名空间工作。以下示例是为与 Flash IDE 一起使用而编写的,因此假设以下...
轨迹文件
package com.atriace {
public namespace locus = "atriace.com";
}
测试A.as
package com.atriace {
public class testA {
import com.atriace.locus;
locus var foo:String = "Apple";
public function testA() {}
}
}
测试B.as
package com.atriace {
public class testB {
import com.atriace.locus;
use namespace locus;
public function testB() {
trace(foo);
}
}
}
文件类:
import com.atriace.testA;
import com.atriace.testB;
var a:testA = new testA();
trace(a.foo); // results in "Apple"
var b:testB = new testB(); // compile error: variable "foo" not defined.
问题 #1
在我看来,命名空间只不过是一个保存具有范围级别访问权限的变量的对象。因此,global 是所有函数都可见的命名空间(因为它是根作用域),local 是命名空间(特定于当前和子作用域),等等。如果为真,则切换到带有
use
的命名空间应该允许您简单地声明碰巧存在于本地和自定义命名空间中的变量。例如:use namespace locus
var bar:String = "test"; // this now *should* exist in both local & locus scope/namespace.
由于我不知道有一种方法可以像普通对象一样遍历命名空间,因此我不知道是否会发生这种情况。此外,我还没有看到有人以这种方式声明自定义命名空间变量的任何情况,因此我假设命名空间变量必须始终明确定义。
问题#2
你可能会问,“这里的目标是什么?”很简单,我们想要一个动态的变量和方法池,任何新类都可以添加到(在同一个包中)。通过在调用方法之前切换到这个命名空间,我们可以减少代码的冗长。所以,
class.method()
变得只是 method()
.在 testB.as 中,如果我们从未导入 testA.as 类并对其进行实例化,我们会完全预料到会发生错误;特别是因为 foo 不是类的静态成员(我们也不希望它是)。然而,由于我们至少实例化了一次 foo,命名空间
locus
现在应该有一个名为 foo
的变量,这意味着当 testB.as 被实例化,并且构造函数为 foo 寻找一个值时,命名空间已经有了一个。显然,这种想法存在缺陷,因为 Flash 编译器提示
foo
从未被声明,我唯一可以引用的方法 foo
来自文档类是通过引用容器(即,a.foo
而不是仅仅切换到使用使用的命名空间,并直接跟踪 foo
)。For the sake of argument, neither inheritance nor static members are a solution to this dilema. This is both an excercise in learning better code techniques, and an answer to the structure of a large utility class that has complicated dependencies. Given the absence of a variable/method, you could simply code around it.
我知道这不是一个被大量记录的主题,这就是为什么我希望这里的一些圣人可能会看到我遗漏的东西。非常感谢您的帮助。 :)
最佳答案
“使用命名空间”是针对消费者的。您始终必须在任何声明中包含命名空间:
MyNamespace var foobar : uint;
如果你想添加命名空间包全局变量(你不应该作为一般规则),你必须在单独的 .as 文件中定义它们中的每一个,因为包只允许每个文件在顶部有一个公开可见的定义 -等级。
在上面的示例中,您错误地使用了命名空间。命名空间可以跨越多个类,但无法实现您正在寻找的跨类功能。这更像是面向方面编程的领域。
关于actionscript-3 - 类之间的命名空间变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10708802/