2012-02-08 49 views
3

我想封装一个包,以便无法访问项目外没有任何含义的类,属性和方法。但是,他们必须可以通过项目中的其他类访问,因此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):“用户定义的命名空间属性只可用于类定义的顶层。“那是什么意思?命名空间是否意味着以其他方式使用?

回答

4

由于您试图将名称空间应用于整个类,但用户定义的名称空间仅限于与变量和函数一起使用(“类定义的顶级”表示“元素内部为 a类”)。如果你打算说“但是这很愚蠢!”我只能同意你的看法 - 将类名和接口提供给名称空间也更有意义。仍然:这些是规则。 :(

我也相信你的空间定义没有正确完成,如果你打算使用一个命名空间多单类,它应该在一个单独的文件中声明是这样的:。

package my_package { 
    public namespace myproject; 
} 

/my_package/myproject.as

package my_package { 
    internal namespace myproject_internal; 
} 

/my_package/myproject_internal.as

注意internal在这种情况下specifi对于命名空间本身,而不是用于您正在使用的函数和变量的可见性- 在自定义命名空间(duh!)内,这些将可见。如果您打算使用internal命名空间,那么您的实现类必须驻留在同一个包中 - 否则该命名空间将无法访问。

有关命名空间的综合信息,请参阅Grant Skinner's blog post

最后,但并非最不重要,我会强烈建议不要使用“父”作为包的名称 - 除了它是一个很暧昧的名字,这很容易导致连同显示对象,其中parent使用时命名冲突指的是实际的父对象。

+0

感谢您的链接,这有助于吨。 根据软件包名称,我实际上没有使用父级 - 我只是在示例中将父级用作占位符名称。 – Monchoman45 2012-02-08 18:59:08

+0

啊,好的。您可能希望在将来制作“mypackage” - 您永远不会知道谁会直接从您的示例中获得:) – weltraumpirat 2012-02-08 19:01:39