C # класс / пространство имен Access - PullRequest
1 голос
/ 25 августа 2009

Я задавал этот вопрос нескольким людям, и до сих пор у меня нет ответа.

ASP.NET C #

Дерево проекта (файлы и папки):

> (ROOT) 
>
> Class MyAccess (namespace myproject.core)
> 
> (Directory John)
------> Class MyJohn          (namespace myproject.core.John)
------> Class JohnSecret      (namespace myproject.core.John)
------> Class OtherJohnSecret (namespace myproject.core.John)
> 
> (Directory Paul)
------> Class MyPaul          (namespace myproject.core.Paul)
------> Class PaulSecret      (namespace myproject.core.Paul)

Как я могу использовать (общедоступный, закрытый, защищенный, внутренний) ????? иметь такое поведение:

  • class MyJohn видит и может создавать объекты из всех классов в папке John (все его секреты)
  • Класс MyPaul ведет себя так же, но внутри папки Пола
  • Все эти секреты нельзя использовать вне этих папок.

Примеры:

  • MyPaul может использовать все свои секреты и общаться с классами MyAccess и MyJohn.
  • MyPaul, MyJohn, MyAccess будет общедоступным или внутренним
  • MyAccess не может использовать PaulSecret.

Решения, которые мне не нравятся:

  • ПЛОХОЙ раствор 1

Сделай секреты Джона охраняемыми и наследственными. MyJohn

* +1040 * Пример: * * тысяча сорок один
> protected JohnSecret
> internal MyJohn:JohnSecret

плохо, потому что если у меня есть 100 секретов класса, мне нужно что-то вроде:

> internal MyJohn:JohnSecret1, JohnSecret2,....,JohnSecret100
  • ПЛОХОЙ раствор 2

Есть классы внутри классов:

> internal class MyJohn {
> 
>        internal string DoSomething(){}
>        
>        private class JohnSecret{}
>        private class JohnSecret2{}
>        private class JohnSecret3{}
>
> }

Это нехорошо, потому что, опять же, если у меня будет 100 секретов, у меня будет ОГРОМНЫЙ файл, я не смогу разбить этот код на разные файлы исходного кода.


Кто-нибудь может дать хорошее решение?

Я ценю:)

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 25 августа 2009

Вы должны пойти со вторым решением, которое вы предлагаете. Для требований к видимости это наиболее подходит для JohnSecret, OtherJohnSecret, et. и др. определяется внутри класса MyJohn.

Если вы хотите разделить файл класса на несколько файлов, вы можете использовать частичные классы для достижения этого и при этом поддерживать требования к видимости, которые у вас есть.

Например:

> (Directory John)
> File "MyJohn.cs"
public partial class MyJohn
{
}

> File "JohnSecret.cs"
public partial class MyJohn
{
    private class JohnSecret
    {
    }
}

> File "OtherJohnSecret.cs"
public partial class MyJohn
{
    private class OtherJohnSecret
    {
    }
}
1 голос
/ 25 августа 2009

C # имеет следующий доступ.

  • public - каждый может это увидеть
  • private - только вещи внутри класса могут видеть это
  • protected - только вещи внутри класса или внутри производных классов могут видеть его
  • internal - только вещи внутри сборки (dll или exe) могут видеть это
  • protected internal - только вещи внутри класса или производных классов могут видеть его, и только если они находятся в одной сборке

У вас есть только 2 варианта:

Примечание. Для создания нескольких сборок необходимо создать несколько проектов в Visual Studio.


С прагматической точки зрения, действительно ли имеет значение, если каталоги отгорожены друг от друга таким образом? Использование модификаторов доступа не дает никаких преимуществ с точки зрения безопасности, поскольку каждый может использовать рефлексию, чтобы в любом случае легко вызывать ваши частные / внутренние методы.

Основное преимущество, которое он дает вам, заключается в том, чтобы не мешать при кодировании, но вы уже поместили их в разные пространства имен, что в любом случае должно помочь с беспорядком.

...