C # Ограничить создание экземпляра класса в пределах пространства имен - PullRequest
8 голосов
/ 13 апреля 2011

У меня есть два объекта, RoomManager и Room, будет несколько Room с и один RoomManager. Я хочу, чтобы RoomManager был единственным, кому разрешено создавать Room объект. Поэтому мне интересно, есть ли способ сделать конструктор Room (и остальные методы / свойства Room) доступными только для RoomManager. Я подумал, может быть, переместив их в их собственное пространство имен и сделав Room приватным или внутренним или что-то в этом роде. Из Уровни доступности (C # Reference) Я вижу, что внутренняя часть предназначена для всей сборки, а не только для пространства имен.

Ответы [ 4 ]

9 голосов
/ 13 апреля 2011

Нет, C # (и .NET в целом) не имеет модификаторов доступа, специфичных для пространств имен.

Одним из довольно хакерских решений было бы сделать Room просто иметь приватный конструктор и сделать RoomManager вложенным классом (возможно, просто называемым Manager):

public class Room
{
    private Room() {}

    public class Manager
    {
        public Room CreateRoom()
        {
            return new Room(); // And do other stuff, presumably
        }
    }
}

Используйте это так:

Room.Manager manager = new Room.Manager();
Room room = manager.CreateRoom();

Как я уже сказал, это немного глупо. Вы, конечно, могли бы поместить Room и RoomManager в отдельную сборку.

3 голосов
/ 13 апреля 2011

Вы можете сделать что-то вроде этого:

var room = Room.Factory.Create();

Если конструктор Room является личным, он все равно будет доступен из Room.Factory, если вы объявите фабричный класс внутри класса Room.

1 голос
/ 13 апреля 2011

Может быть полезно определить комнату внутри самого RoomManager и сделать его личным конструктором.

РЕДАКТИРОВАТЬ: Но лучшее решение, которое я считаю, состоит в том, чтобы извлечь абстрактный класс из комнаты и открыть этот класс для клиентов.

Никто не может создать экземпляр абстрактного класса.

0 голосов
/ 13 апреля 2011

Вы должны реализовать ' Singleton pattern '. Он создает объект только один раз, и любые последующие попытки создать объект этого типа фактически возвращают уже созданный объект.
Вы должны создать фабрику классов, которая бы реализовала синглтон для RoomManager. Room, в свою очередь, должен быть закрытым типом RoomNamager. У менеджера RoomNamager должен быть метод создания Room. Но в этом случае вы не можете получить доступ к Room свойствам вне класса RoomManager. Чтобы решить эту проблему, я рекомендую вам создать IRoom открытый интерфейс, который предоставит доступ к функциональности комнаты. Таким образом, ваш метод create room вернет интерфейс IRoom.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...