Exemplos em Ensaio Desenvolvimento Orientado por exemplo por Kent Beck
Pergunta
Eu estou lendo através Test Driven Development: por exemplo e um dos exemplos está me incomodando. No capítulo 3 (igualdade para todos), o autor cria uma função equals
na classe Dollar
para comparar dois objetos Dollar
:
public boolean equals(Object object)
{
Dollar dollar= (Dollar) object;
return amount == dollar.amount;
}
Em seguida, no capítulo seguinte. (4: Privacy), ele faz ascender um membro particular da classe dólar
private int amount;
e os testes passam. Caso não esta causa um erro do compilador no método equals
porque enquanto o objeto pode acessar o seu próprio membro amount
como ele é impedido de acessar membro Dollar
outro objeto amount
?
//shouldn't dollar.amount be no longer accessable?
return amount == dollar.amount
Am I fundamentalmente mal-entendido private
?
Atualizar Eu decidi ir para trás e código junto com o livro manualmente e quando cheguei para a próxima parte (capítulo 6 - igualdade para todos, Redux), onde eles empurram montante em uma classe pai e torná-lo protegido, eu estou recebendo problemas de acesso:
public class Money
{
protected int amount;
}
public class Dollar : Money
{
public Dollar(int amount)
{
this.amount = amount;
}
// override object.Equals
public override bool Equals(object obj)
{
Money dollar = (Money)obj;
//"error CS1540: Cannot access protected member 'Money.amount'
// via a qualifier of type 'Money'; the qualifier must be of
// type 'Dollar' (or derived from it)" on the next line:
return amount == dollar.amount;
}
}
Isso significa que protected
é baseado em instância em C #?
Solução
Sim, você está mal-entendido fundamentalmente privada. Privacidade é específico de classe, não específico da instância.
Outras dicas
Fundamentalmente mal-entendido privada, dólar pode acessar qualquer método privado dólar se eles são da mesma classe.
modificador privado é class-privada , não objeto-privadas.
Em Java, private
significa class-privada. Dentro da classe, você pode acessar esse campo em todas as instâncias da classe.
Em Scala, há também um escopo do objeto-privada que está escrito private[this]
. Também em outros aspectos escopos de Scala são mais flexíveis (ver este artigo para mais informações).
Mas em Java não há espaço objeto-privadas.
Em línguas da família C ++ (C ++, Java, C #), controle de acesso é apenas no nível de classe. Então private
permite o acesso a qualquer instância dessa classe.
IIRC em se comporta de privacidade Smalltalk como você espera.