Exemples de développement piloté par les tests, par exemple, par Kent Beck
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 #?
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.