命名空间错误:“类定义的顶级”?

时间:2012-02-08 17:03:27

标签: flash actionscript-3 namespaces encapsulation

我正在尝试封装一个包,以便无法访问项目之外没有任何意义的类,属性和方法。但是,它们必须可由项目中的其他类访问,因此internal不足 - parent.foo.AClass无法访问parent.bar.AnotherClass的内部属性。我的印象是命名空间可以解决这个问题,所以我尝试了这个:

//Class in top level package, where we make our namespaces
package parent {
    public namespace myproject;
    internal namespace myproject_internal;

    myproject class Top {
        //code
    }
}

//Some class not meant for use outside of the project
package parent.foo {
    use namespace myproject;
    use namespace myproject_internal;

    myproject_internal class AClass {
        //code
    }
}

//Some other class that can be accessed outside of the project,
//but is in a different subpackage
package parent.bar {
    use namespace myproject;
    use namespace myproject_internal;

    myproject class AnotherClass {
        //code
    }
}

但是,这会在类AnotherClass中的myproject class AnotherClass处抛出编译器错误:“用户定义的命名空间属性只能在类定义的顶层使用。”那是什么意思?命名空间是否意味着以其他方式使用?

1 个答案:

答案 0 :(得分:4)

抛出错误,因为您尝试将命名空间应用于整个类,但用户定义的命名空间仅限于与变量和函数一起使用(“类定义的顶级”表示<中的元素 / em>一个类“)。如果你要说“但那太愚蠢了!”我只能同意你的看法 - 让类和接口可用的命名空间更有意义。仍然:这些是规则。 :(

我也相信你的命名空间定义没有正确完成。如果您要将命名空间用于多个类,则应在单独的文件中声明它。类似的东西:

package my_package {
    public namespace myproject;
}
<{1>}中的

/my_package/myproject.as
package my_package { internal namespace myproject_internal; } 中的

请注意,/my_package/myproject_internal.as在这种情况下指定名称空间本身的可见性 ,而不是您使用它的函数和变量 - 这些将在中显示自定义命名空间(呃!)。如果您要使用internal命名空间,则您的实现类必须驻留在同一个包中 - 否则该命名空间将无法访问。

有关名称空间的全面信息,请参阅Grant Skinner's blog post

最后,但并非最不重要的是,我强烈建议不要使用“parent”作为包名 - 除了它是一个非常模糊的名称之外,当与显示对象结合使用时,这很容易导致命名冲突,其中{{ 1}}指的是实际的父对象。