Имена классов и пространств имен одинаковы? - PullRequest
1 голос
/ 26 февраля 2012

Я новичок в C # (хотя я хорошо знаю Java) и столкнулся с проблемой именования пространств имен и классов / интерфейсов.

Что не сработает, так это:

- Projekt
--> (Interface) Node
--> (Namespace/Folder) Node
-----> (Class): SomethingNode : Node
-----> ... 

Поскольку есть ошибка, что тип "Project.Node" и пространство имен "Project.Node" имеют одинаковые имена.

Я объясню, почему я намеренно хотел бы назвать их одинаковымиУ меня есть много классов, которые реализуют интерфейс "Узел".Все эти классы должны быть в одном пространстве имен, так почему бы не назвать их «Узлом», подумал я.Интерфейс «Узел» должен находиться в корневом пространстве имен проекта, потому что он используется другими классами, и я не хочу, например, перемещать интерфейс «Узел» в «Project.Node.Node», потому что я думаю, что было бы глуповсегда импортируйте "Project.Node" только потому, что мне нужен интерфейс.

Итак, мой вопрос, как мне решить эту ситуацию?Как мне назвать мои классы / пространства имен, есть ли хороший элегантный способ сделать это, есть ли соглашения об именах для такой ситуации?

Ответы [ 4 ]

8 голосов
/ 26 февраля 2012

Вы должны следовать соглашениям .NET и назвать свой интерфейс INode. Тогда классы внутри пространства имен Node будут реализовывать ваш интерфейс INode.

1 голос
/ 26 февраля 2012

Пространства имен в .Net очень похожи на пакеты в Java.Вы можете обойти это, вызвав свой интерфейсный узел.Это соглашение .Net ставить перед интерфейсом букву I. Глупо, венгерская нотация, но глупые соглашения - это то, к чему разработчики .Net все равно привыкли; -)

1 голос
/ 26 февраля 2012

Самое простое решение проблемы - просто принять соглашение об именах C # / .NET для интерфейсов, то есть добавить I - INode, а не Java-esque Node.Кроме того, он ДОЛЖЕН сидеть под пространством имен узлов.Импорт пространства имен не является трудоемким действием, тем более что большинство IDE, и, конечно, Visual Studio, могут автоматизировать его для вас.Это препятствует тому, чтобы ваше корневое пространство имен было переполненным и непостижимым.

Во-вторых, я думаю, что более интуитивное имя для пространства имен использует множественное число: Projekt.Nodes, так что у вас будет это:

namespace Projekt
{
    namespace Nodes
    {
        public interface INode { }
        public class Node : INode { }
    }
}
0 голосов
/ 26 февраля 2012

Вы не можете иметь конфликт имен между типами и пространствами имен. Кроме того, существует соглашение .Net с префиксами интерфейсов с большой буквы «i», поэтому ваш интерфейс Node станет INode. Это стандарт среди всех библиотек и компонентов .Net Framework. Применение стандарта к вашему коду должно легко решить вашу проблему коллизий.

Теперь, на мой взгляд, с архитектурной точки зрения, если бы все реализации INode находились в пространстве имен Node, я бы также ожидал найти INode под ним.

...