Quel différence y a t il entre les variables Private, Protected et Public ?
zenx
Membre
En fait ma question est plus complète. J'aimerais non seulement connaà®tre les subtilités entre ces différents modes de variable (Private, Protected et Public), mais je souhaiterais également savoir quand privilégier les méthodes d'acces (ou accesseur) plutôt que le symbol de déférencement -> pour acceder à une variable. En bref, y a t-il des equivalences dans tout cela ou des différences et dans tous les cas quelles en sont leurs natures ?.
D'avance merci !
D'avance merci !
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Public: accessible par tous les objets(devrait être interdit??)
Private: accessible par cette classe et les classes héritées de celle-ci (comportement par défaut)
Protected: accessible seulement par cette classe (ultra-sécuritaire, par exemple si tu publies la classe).
La règle semble d'utiliser systèmatiquement les accesseurs, même dans la classe elle-même (sauf pour la méthode qui implémente les accesseurs ).
Normalement, on ne devrait jamais utiliser la variable sans passer par son accesseur dans un autre objet :brule: (sauf si l'accesseur n'existe pas...).
Il y a intervertion entre @private et @protected.
C'est bien @private qui n'autorise la vue des variables d'instance que dans la classe elle-même, alors que @protected l'autorise aussi pour les sous-classes.
Par défaut, les variables d'instance sont toujours @protected.
.
Pour moi, le mot privé me semble plus fort que protégé.
Tu protèges ta maison, donc ce qui est à l'extérieur n'a pas de droit d'entrée, mais les autres habitants (les sous-classes) y circulent tout de même.
Ta chambre est privée : donc seul toi peux y aller, et y faire les choses secrètes que personne ne doit voir...
.
D'autres part, quel est la forme la plus acceptable pour une methode d'acces ?. Est ce que le code qui suit est convenable ? :
int maVar;
// méthode d'acces de maVar
- (int)maVar {
return maVar;
}
Oui, on n'utilise quasiment jamais le déférencement en Objective-C, d'ailleurs j'avais cherché longuement après la syntaxe, à l'époque...
Non!
la variable est encapsulée dans l'objet qui la contient.
La valeur de cette variable sera accessible à n'importe quel endroit du programme pour peu qu'il ait accès à l'objet de cette classe dont tu veux connaà®tre la valeur de sa variable (je ne sais pas si cette phrase est compréhensible...)
Si tu n'implémentes que maVar, personne ne peux modifier la valeur, sauf l'objet lui-même.
Pour les variables numériques simples, ton accesseur me semble très convenable :adios!:
NSArray *monTableau;
- (NSArray *)monTableau {
return monTableau;
}
Quel est alors la forme correct pour une variable de type objet mutable (je sais pas si ça se dit) comme suivant :
NSMutablearray *monTableau;
- (NSMutablearray *)monTableau {
return monTableau
}
Dans tous les cas puis je donc écrire ma méthode d'acces ainsi ?
Pardon d'insister !
Dans le cas des mutables, l'accesseur doit plutôt être:
return [[myArray copy] autorelease];
Quand tu ecris : return [[myArray copy] autorelease];
Cela retourne un nouvel Objet (une copie parfaite de myArray) au destinataire et sa décrémente son retaincount (celui de la copie de l'objet) une fois que le destinataire a mit la main dessus c'est bien cela ?.
Si le destinataire veut le garder en dehors de sa méthode, il doit faire un retain.