Faire des méthodes / propriétés visibles à une classe, cachée aux autres

StackOverflow https://stackoverflow.com/questions/550268

  •  23-08-2019
  •  | 
  •  

Question

J'ai un Server de classe qui parle à une connexion au serveur pour IRC. Il contient une liste de Users connus, et les crée au besoin.

J'ai deux problèmes impliquant la classe User:

  1. Tout le monde peut créer une instance d'un User. Je ne veux que la classe Server pour être en mesure de le faire.
  2. Si un utilisateur (la User chose décrit) change / son nom (ou d'autres informations, comme les chaînes jointes), la classe Server peut changer lui-même. Cependant, d'autres classes peuvent aussi! Je veux désavouer les autres classes de toucher ces informations (ce qui en fait leur lecture seule à).

Comment puis-je résoudre ces deux problèmes? En C ++, il peut être résolu en utilisant le mot-clé friend et de faire le cteur et setName (et autres) privées.

Y at-il un mot-clé C # qui peut permettre une certaine méthode être accessible par une classe déterminée? Cela résoudrait mon problème.

Était-ce utile?

La solution

Honnêtement, je trouve l'accès friend qui a pris naissance à partir de C ++ pour être symptomatique d'une mauvaise conception. Vous êtes mieux fixer votre conception.

Pour commencer, qui se soucie vraiment si quelqu'un crée un utilisateur? Est-ce que c'est vraiment important? Je demande cela parce qu'il semble que parfois nous les programmeurs sont pris inquiéter des choses qui ne se produira pas ou tout simplement, si elles le font, il n'a pas d'importance.

Si vous avez vraiment soin puis effectuez l'une des opérations suivantes:

  • une interface utilisateur. Server peut instancier une classe privée qui met en œuvre; ou
  • Donner à l'utilisateur une classe interne du serveur sans constructeur public afin que le serveur peut instancier.

hacks de visibilité (dont des amis en C ++ sont un accès paquet en Java sont deux bons exemples) demandent simplement des problèmes et pas une bonne idée.

Autres conseils

Le plus proche dans le monde .NET à friend est la visibilité de internal.

Notez que si vos deux classes sont assemblées distinctes, vous pouvez utiliser le InternalsVisibleTo attribut pour permettre une visibilité de l'ensemble des composants internes de l'autre.

Refonte votre hiérarchie de classe est probablement une solution juste à ce problème. Parce qu'il me semble que ce que vous avez vraiment besoin est une lecture seule classe utilisateur lorsqu'il existe en dehors de la classe Server.

Je ferais probablement quelque chose comme ceci:

// An abstract base class. This is what I'd use outside the 
// Server class. It's abstract, so it can't be instantiated
// on its own, and it only has getters for the properties. 
public abstract class User
{
   protected User()
   {
   }

   public string Name { get;}
   // Other get-only properties
}

public class ServerUser : User
{
   public ServerUser()
   {
   }

   public string Name { get; set;}
   // Other properties. 
}

Ensuite, ont les classes serveruser de classe serveur a créé, l'utilisateur classe le serveur pour modifier les propriétés sur les classes serveruser (comme le nom d'utilisateur de changer), mais seulement exposer les classes d'utilisateurs au monde extérieur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top