use
语句时在命名空间中声明变量? (即,没有使用变量名称声明名称空间) trace(foo)
而不是trace(a.foo)
[如果我必须在切换到命名空间之后必须说明这一点,那似乎毫无意义]) 阅读了格兰特斯金纳的"Complete Guide to Using Namespaces"和其他文章,如杰克逊杜斯坦的"Better OOP Through Namespaces",我留下了上述未解答的问题。我觉得好像缺少一些基本原则,但我似乎无法使命名空间工作。编写以下示例以与Flash IDE一起使用,因此请假设以下内容...
locus.as
package com.atriace {
public namespace locus = "atriace.com";
}
testA.as
package com.atriace {
public class testA {
import com.atriace.locus;
locus var foo:String = "Apple";
public function testA() {}
}
}
testB.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.
在我看来,命名空间只不过是一个保存具有范围级别访问权限的变量的对象。 Ergo,global是所有函数可见的命名空间(因为它是根范围),local是命名空间(特定于当前和子范围),依此类推。如果为true,则切换到具有use
的命名空间应该允许您简单地声明恰好存在于本地和自定义命名空间中的变量。例如:
use namespace locus
var bar:String = "test"; // this now *should* exist in both local & locus scope/namespace.
由于我不知道像普通对象一样迭代命名空间的方法,我不知道这是否发生了。此外,我没有看到有人以这种方式声明自定义命名空间变量的情况,因此我假设必须始终明确定义命名空间变量。
你可能会问,“这里的目标是什么?”很简单,我们想要一个动态的变量和方法池,任何新类都可以添加(在同一个包中)。通过在调用方法之前切换到此命名空间,我们可以减少代码的冗余度。因此,class.method()
变为method()
。
在 testB.as 中,如果我们从未导入 testA.as 类并实例化它,我们完全可以预料会发生错误。特别是因为foo不是类的静态成员(我们也不希望它)。但是,由于我们至少实例化了一次foo,因此命名空间locus
现在应该有一个名为foo
的变量,这意味着当 testB.as 被实例化时,构造函数为foo寻找一个值,命名空间已经有一个。
显然,这个想法有一个缺陷,因为Flash编译器抱怨从未声明foo
,并且我可以从文档类引用foo
的唯一方法是引用容器(即。,a.foo
而不是仅使用use切换到命名空间,并直接跟踪foo
。
为了论证,继承和静态成员都不是这种困境的解决方案。这既是学习更好的代码技术的练习,也是具有复杂依赖性的大型实用程序类的结构的答案。如果没有变量/方法,您可以简单地围绕它进行编码。
我知道这不是一个记录很多的话题,这就是为什么我希望这里的一些圣人能看到我所缺少的东西。非常感谢帮助。 :)
答案 0 :(得分:1)
“use namespace”用于消费者方面。您总是必须在任何声明中包含命名空间:
MyNamespace var foobar:uint;
如果你想添加命名空间的包全局变量(你不应该作为一般规则),你必须在一个单独的.as文件中定义它们中的每一个,因为包只允许每个文件有一个公开可见的定义顶级。
在上面的示例中,您错误地使用了名称空间。命名空间可以跨多个类,但不能实现您正在寻找的跨类功能。这更像是面向方面编程的领域。