108 votes

Accéder au champ privé d'un autre objet de la même classe

class Person 
{
   private BankAccount account;

   Person(BankAccount account)
   {
      this.account = account;
   }

   public Person someMethod(Person person)
   {
     //Why accessing private field is possible?

     BankAccount a = person.account;
   }
}

S'il vous plaît, oubliez le design. Je sais que la POO spécifie que les objets privés sont privés à la classe. Ma question est la suivante : pourquoi la POO a-t-elle été conçue de telle sorte que les champs privés aient un accès au niveau de la classe et que les champs privés ne soient pas accessibles au niveau de la classe ? pas d'accès au niveau des objets ?

1voto

Temp Agilist Points 88

Juste mes deux centimes sur la question de savoir pourquoi la sémantique de la visibilité privée en Java est au niveau de la classe plutôt qu'au niveau de l'objet.

Je dirais que commodité semble être la clé ici. En fait, une visibilité privée au niveau de l'objet aurait obligé à exposer les méthodes à d'autres classes (par exemple dans le même paquet) dans le scénario illustré par le PO.

En vérité, je n'ai pu ni concocter ni trouver un exemple montrant que la visibilité au niveau classe-privée (comme celle offerte par Java) crée des problèmes si on la compare à la visibilité au niveau objet-privé.

Cela dit, les langages de programmation dotés d'un système plus fin de politiques de visibilité peuvent permettre la visibilité des objets au niveau des objets et des classes.

Par exemple Eiffel offre une exportation sélective : vous pouvez exporter n'importe quelle fonctionnalité de classe vers n'importe quelle classe de votre choix, de {NONE} (objet-privé) à {ANY} (équivalent de public, un objet de classe). (objet-privé) à {ANY} (l'équivalent de public, et aussi la valeur par défaut), à {PERSON} (classe-privée, voir l'exemple du PO), à des groupes spécifiques de classes {PERSON, BANQUE}.

Il est également intéressant de noter qu'en Eiffel, il n'est pas nécessaire de rendre un attribut privé et d'écrire un getter pour empêcher les autres classes de l'affecter. Les attributs publics en Eiffel sont par défaut accessibles en lecture seule, vous n'avez donc pas besoin d'un getter pour retourner leur valeur.

Bien sûr, vous avez toujours besoin d'un setter pour définir un attribut, mais vous pouvez le cacher en le définissant comme "assigner" pour cet attribut. Cela vous permet, si vous le souhaitez, d'utiliser l'opérateur d'affectation, plus pratique, au lieu de l'invocation du setter.

0voto

darijan Points 6139

Parce que le private modificateur d'accès le rend visible uniquement dans le cadre de la classe . Cette méthode est toujours dans la classe .

0voto

Le mot-clé "private" indique que le champ ou la méthode est caché à la vue de toute autre classe.

0voto

ola Points 160

El private est accessible dans la classe/objet dans laquelle le champ est déclaré. Il est privé pour les autres classes/objets en dehors de celui dans lequel il se trouve.

0voto

zerocool Points 1405

Essayez-vous de dire qu'aucun objet ne devrait être en mesure d'accéder à cet attribut privé par tous les moyens possibles ? Quel est l'intérêt d'avoir cet attribut alors ? D'une certaine manière, cet attribut contribue à l'état de l'objet mais cet état n'est connu de personne d'autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X