Ошибка пространства имен: «Верхний уровень определения класса»? - PullRequest
3 голосов
/ 08 февраля 2012

Я пытаюсь инкапсулировать пакет, чтобы классы, свойства и методы, не имеющие никакого значения вне проекта, были недоступны.Они, однако, должны быть доступны другим классам в проекте, поэтому 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): "aопределенный пользователем атрибут пространства имен может использоваться только на верхнем уровне определения класса. "Что это значит?Должны ли пространства имен использоваться как-то иначе?

1 Ответ

4 голосов
/ 08 февраля 2012

Ошибка выдается, потому что вы пытаетесь применить пространство имен ко всему классу, но определяемые пользователем пространства имен ограничены для использования с переменными и функциями («верхний уровень определения класса» означает «элементы в пределах *» 1002 * класс "). Если вы собираетесь сказать «Но это глупо!» Я могу только согласиться с вами - было бы гораздо разумнее иметь пространства имен для классов и интерфейсов. Еще: таковы правила. :(

Я также считаю, что ваше определение пространства имен не правильно. Если вы собираетесь использовать пространство имен для более чем одного класса, оно должно быть объявлено в отдельном файле. Что-то вроде:

package my_package {
    public namespace myproject;
}

в /my_package/myproject.as и

package my_package {
    internal namespace myproject_internal;
}

в /my_package/myproject_internal.as.

Обратите внимание, что internal в этом случае определяет видимость для самого пространства имен , а не для функций и переменных, с которыми вы его используете - они будут видны в пользовательском пространстве имен (дух!). Если вы собираетесь использовать пространство имен internal, ваш реализующий класс должен находиться в одном и том же пакете, иначе это пространство имен будет недоступно.

См. Сообщение в блоге Гранта Скиннера для получения полной информации о пространствах имен.

Наконец, но не в последнюю очередь, я бы настоятельно рекомендовал не использовать «parent» в качестве имени пакета - кроме того, что это очень неоднозначное имя, это может легко привести к конфликтам имен при использовании в сочетании с экранными объектами, где parent относится к фактическому родительскому объекту.

...