Pergunta

É recomendado para variáveis ??membro conjunto de uma classe base para protegido, de modo que subclasses pode acessar essas variáveis? Ou é mais recomendado para definir as variáveis ??de membro para privada e deixar as subclasses obter ou definir o varible por getters e setters?

E se é recomendável usar o método de getters e setters, variáveis ??quando são protegidas usado?

Foi útil?

Solução

Isto é muito semelhante este pergunta, sobre se a informação de acesso dentro da mesma classe via propriedades ou acesso directo. É provavelmente vale a pena ler todas essas respostas também.

Pessoalmente, eu não gosto de todos os campos para ser não-privada com a exceção ocasional de campos somente leitura estático com valores imutáveis ??(quer const ou não). Para mim, propriedades apenas dar um melhor grau de encapsulamento. Como os dados são armazenados é uma aplicação decisão, não um API decisão (ao contrário de propriedades). Por que deveria classe Foo decorrente da classe cuidado Bar sobre o aplicação de classe Bar?

Em suma, eu sempre ir para propriedades, e eu não usar variáveis ??protegidas para outra coisa senão descartável código de teste.

Com implementado automaticamente as propriedades em C # 3.0, é mais fácil do que nunca para transformar os campos em propriedades. Há preciosa razão pouco não para fazê-lo.

Outras dicas

As classes em outros conjuntos podem derivar de suas aulas não seladas e podem acessar campos protegidos. Se você decidir um dia para fazer esses campos em propriedades, essas classes em outros conjuntos terão de ser recompilados para trabalhar com a nova versão do seu conjunto. Isso é chamado de "quebrar a compatibilidade binária", e é talvez a única razão sólida por que você não deve nunca expor campos fora de uma montagem.

Eu tenho que concordar com Jon.

Mas, eu uso variável protegida para "mais alto" em algum momento classe herança em alguma condição. Exemplo, se você tem um objeto que é somente leitura e você não pode configurá-lo de volta, mas que você pode usá-lo em uma classe criança, eu não vejo por que eu deveria ter um Get protegida para ter acesso a essa variável. Uma variável protegida simples fazer o mesmo encapsulamento porque você não pode definir essa variável e você pode acessar esta variável apenas a partir da classe infantil.

Mas set / get é a maneira de fazer por outra situação.

Este é um trade-off aqui. Setters e getters são um pouco mais lento do que acessar campos diretamente, por isso, se você está fazendo matemática pesados ??e ler / escrever estes campos muito em suas subclasses, você deve ir para acessar os campos diretamente. Mas este é mais como uma exceção.

Normalmente, você deve marcá-los como privado e ir para getters / setters.

Assim, a minha resposta é: acesso directo para campos muito utilizada, getters / setters de outra forma. Use o bom senso.

EDIT:. Fiz algumas profiling e, aparentemente, até mesmo no modo de versão, pode haver até a diferença de velocidade de 20% entre campos e propriedades Veja o meu caso de teste aqui: http://pastebin.com/m5a4d1597

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