9
votes

C # Limiter la création de l'instance de classe à l'espace de noms

J'ai deux objets, RoomManager et Chambre , il y aura plusieurs salle s et un RoomManager . Je veux que le RoomManager soit le seul autorisé à créer un objet de la salle . Donc, je me demande s'il y a un moyen de faire le Constructeur Constructeur (et le reste de la salle Méthodes / propriétés) uniquement accessible au RoomManager . Je pensais peut-être les déplacer dans leur propre espace de noms et faire une chambre privée ou interne ou quelque chose. De Niveaux d'accessibilité (C # Référence) Je vois que l'interne est pour l'ensemble de l'assemblage, pas seulement l'espace de noms.


4 commentaires

Chaque fois que je vois XManager, je me souviens de cet article: CODINGHORREROR .com / Blog / 2006/03 / ...


Vous pouvez faire salle une classe privée à l'intérieur roommanager ?


@Nicholas, bel article .. doit lire. :RÉ


@Nicholas, bon article, je n'avais pas lu celui-là. J'aime aussi le premier commentaire "Eh bien, je me sens intelligent. Je viens de renommer tout * classe de manager à * assistant." :)


4 Réponses :


10
votes

NON, C # (et .NET en général) n'a pas de modificateurs d'accès spécifiques aux espaces de noms.

Une solution de relief piratage serait de faire de la place d'avoir un constructeur privé et de faire une classe imbriquée de RoomManager (éventuellement juste juste Appelé Manager): P>

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


3 commentaires

Chambre et RoomManager ne seront jamais nécessaires pour un seul programme, alors les mettre dans leur propre montage semble être trop excité. Votre approche de «classe de manager en classe» est-elle trop hacky pour être utilisée?


@jon: Je dirais que ce n'est pas du tout hacky, c'est un excellent moyen de faire ce genre de contrôleurs, des gestionnaires ect;)


Stackoverflow .com / questions / 585859 / ...



1
votes

Définir la pièce à l'intérieur de RoomManager lui-même et faire son constructeur privé pourrait être utile.

EDIT: Mais la meilleure solution à laquelle je pense est que d'extraire une classe abstraite de la pièce et d'exposer la classe aux clients.

Personne ne peut créer une instance de la classe abstraite.


2 commentaires

Dans ce cas, le constructeur ne sera pas accessible depuis RoomManager.


Je suis désolé, je ne suis pas suivi avec "extraire une classe abstraite de la pièce". J'ai besoin de créer des instances de la classe de la chambre. Pourriez-vous clarifier un peu?



4
votes

Vous pouvez faire quelque chose comme ceci:

var room = Room.Factory.Create();


0 commentaires

0
votes

Vous devez implémenter ' modèle singleton '. Il crée un objet une seule fois et tout attemps ultérieurs à créer un objet de ce type retourne réellement objet déjà créé.
Vous devriez créer une usine de classe qui implémenterait Singleton pour RoomManager . Chambre , à son tour, devrait être le type privé de Roclamière . Roclamer Manager doit avoir la méthode pour Room Création. Mais dans ce cas, vous ne pouvez pas accéder aux propriétés de la salle en dehors de RoomManager Classe. Pour résoudre ce problème, je vous recommande de créer Idiom interface publique qui accorderait l'accès à la fonctionnalité de la pièce. Donc, votre méthode de chambre retournerait iNoom interface.


0 commentaires