命名空间错误:"Top level of a class definition" ?



我正试图封装一个包,这样就无法访问在项目之外没有意义的类、属性和方法。但是,它们必须由项目中的其他类访问,因此internal是不够的——parent.bar.AnotherClass无法访问parent.foo.AClass的内部属性。我觉得名称空间可以解决这个问题,所以我尝试了这个:

//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
    }
}

然而,这在类定义(myproject class AnotherClass)的AnotherClass中引发了一个编译器错误:"用户定义的命名空间属性只能在类定义的顶层使用。"这意味着什么?命名空间是否意味着以其他方式使用?

抛出错误,因为您正试图将命名空间应用于整个类,但用户定义的命名空间仅限于与变量和函数一起使用("类定义的顶级"意味着"类中的元素")。如果你要说"但那太愚蠢了!"我只能同意你的看法——让类和接口都可以使用名称空间会更有意义。不过:这些都是规则(

我还认为您的命名空间定义没有正确完成。如果要为多个类使用名称空间,则应在单独的文件中声明。类似于:

package my_package {
    public namespace myproject;
}

/my_package/myproject.as和中

package my_package {
    internal namespace myproject_internal;
}

在CCD_ 7中。

请注意,在这种情况下,internal为命名空间本身指定可见性,而不是为与之一起使用的函数和变量指定可见性-这些函数和变量将在自定义命名空间中可见(duh!)。如果要使用internal命名空间,则实现类必须位于同一个包中,否则该命名空间将无法访问。

请参阅Grant Skinner的博客文章,了解有关命名空间的全面信息。

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

最新更新