Tornar os métodos / propriedades visíveis para uma classe, escondido para os outros

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

  •  23-08-2019
  •  | 
  •  

Pergunta

Eu tenho um Server classe que fala com uma conexão de servidor de IRC. Ele mantém uma lista de Users conhecidos, e cria-los quando necessário.

Eu tenho dois problemas que envolvem a classe User:

  1. Qualquer pessoa pode criar uma instância de uma User. Eu só quero a classe Server para ser capaz de fazer isso.
  2. Se um usuário (a coisa User descreve) muda sua / seu nome (ou outras informações, como canais unidas), a classe Server pode mudá-lo em si. No entanto, outras classes também pode! Eu quero desautorizar outras classes de tocar essas informações (tornando-o somente leitura para eles).

Como posso resolver estes dois problemas? Em C ++, pode ser resolvido usando a palavra-chave friend e fazendo o ctor e setName (e tal) privado.

Existe um C # palavra-chave que pode permitir que um determinado método ser acessível por uma classe especificada? Isso resolveria o meu problema.

Foi útil?

Solução

Honestamente, eu encontrar o acesso friend que se originou a partir de C ++ para ser sintoma de má concepção. Você é melhor fora de fixar o seu design.

Para começar, quem realmente se importa se alguém cria um usuário? Será que realmente importa? Pergunto isso porque parece que às vezes nós programadores pego se preocupar com coisas que simplesmente não vai acontecer ou, se o fizerem, não importa.

Se você realmente se importa em seguida, fazer uma das seguintes opções:

  • fazer o usuário uma interface. Servidor pode instanciar uma classe privada que implementa-lo; ou
  • fazer o usuário uma classe interna de servidor sem construtores públicos tão somente Server pode instanciá-lo.

Visibilidade hacks (dos quais amigos em C ++ são um e de acesso ao pacote em Java são exemplos bons) estão simplesmente pedindo para ter problemas e não uma boa idéia.

Outras dicas

O mais próximo no mundo do .NET para friend é a visibilidade internal.

Note que, se suas duas classes estão em conjuntos separados, você pode usar o InternalsVisibleTo atributo para permitir uma visibilidade montagem das partes internas do outro.

Redesenhar sua hierarquia de classes é provavelmente uma solução justa para o problema. Porque parece-me que o que você realmente precisa é de uma classe de usuário somente leitura quando existe fora da classe Server.

Eu provavelmente faria algo assim:

// 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. 
}

aulas ServerUser então tem a classe de servidor criado, o usuário da classe Server para propriedades de mudança sobre as classes ServerUser (como a mudança de nome de usuário), mas apenas expor as classes de usuários para o mundo exterior.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top