Question

Je suis en train de lire le développement piloté par les tests: exemple et un autre des exemples me dérange. Au chapitre 3 (Égalité pour tous), l'auteur crée une fonction égale à dans la classe Dollar afin de comparer deux objets Dollar :

public boolean equals(Object object)
{
    Dollar dollar= (Dollar) object;
    return amount == dollar.amount;
}

Ensuite, dans le chapitre suivant (4: Confidentialité), il fait de amount un membre privé de la classe dollar.

private int amount;

et les tests réussissent. Cela ne devrait-il pas causer une erreur de compilation dans la méthode est égal à , car l'objet peut accéder à son propre membre amount car l'accès à l'autre Dollar membre montant de l'objet?

//shouldn't dollar.amount be no longer accessable?
return amount == dollar.amount

Suis-je en train de mal comprendre privé ?

MISE À JOUR J'ai décidé de coder manuellement le livre et lorsque je suis passé à la partie suivante (chapitre 6 - Égalité pour tous, Redux), où ils insèrent un montant dans une classe parent et le protègent, des problèmes d'accès se présentent:

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;
    }
}

Cela signifie-t-il que l'instance protected est basée sur C #?

Était-ce utile?

La solution

Oui, vous vous méprenez fondamentalement sur le privé. La confidentialité est spécifique à la classe et non à l'instance.

Autres conseils

Fondamentalement privé en mal, Dollar peut accéder à n’importe quelle méthode privée Dollar si elles appartiennent à la même classe.

Le modificateur privé est classe-privé , et non objet-privé.

En Java, private signifie classe-privé. Dans la classe, vous pouvez accéder à ce champ dans toutes les instances de la classe.

Dans Scala, il existe également une portée objet-privé sur laquelle est écrit private [this] . Par ailleurs, les objectifs de Scala sont plus souples (voir cet article pour plus d'informations).

Mais en Java, il n'y a pas de portée objet-privé.

Dans les langages de la famille C ++ (C ++, Java, C #), le contrôle d'accès se fait uniquement au niveau de la classe. Donc, private autorise l'accès à toutes les instances de cette classe.

La protection des renseignements personnels de IIRC dans Smalltalk se comporte comme vous le souhaitiez.

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