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 #?

Foi útil?

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.

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