J'ai deux objets, RoomManager Code> et
Chambre Code>, il y aura plusieurs
salle code> s et un
RoomManager code>. Je veux que le
RoomManager Code> soit le seul autorisé à créer un objet code> de la salle code>. Donc, je me demande s'il y a un moyen de faire le code> Constructeur code> Constructeur (et le reste de la salle code> Méthodes / propriétés) uniquement accessible au
RoomManager code>. Je pensais peut-être les déplacer dans leur propre espace de noms et faire une chambre
code> 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. P>
4 Réponses :
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();
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 / ...
Définir la pièce à l'intérieur de RoomManager lui-même et faire son constructeur privé pourrait être utile. p>
EDIT: strong>
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. P>
Personne ne peut créer une instance de la classe abstraite. P>
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?
Vous pouvez faire quelque chose comme ceci:
var room = Room.Factory.Create();
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 Code>.
Chambre Code>, à son tour, devrait être le type privé de
Roclamière code>.
Roclamer Code> Manager doit avoir la méthode pour
Room Code> Création. Mais dans ce cas, vous ne pouvez pas accéder aux propriétés code> de la salle code> en dehors de
RoomManager Code> Classe. Pour résoudre ce problème, je vous recommande de créer
Idiom code> interface publique qui accorderait l'accès à la fonctionnalité de la pièce. Donc, votre méthode code> de chambre code> retournerait
iNoom code> interface. P>
Chaque fois que je vois XManager, je me souviens de cet article: CODINGHORREROR .com / Blog / 2006/03 / ...
Vous pouvez faire
salle code> une classe privée à l'intérieur
roommanager code>?
@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." :)