méthodes get/set et d'encapsulation en AS3
Je l'ai souvent vu de la description suivante de la "bonne" façon de la mise en œuvre de méthodes get/set:
public class Foo {
private var _someVar:SomeClass;
public function get someVar():SomeClass {
return _someVar;
}
public function set someVar(newValue:SomeClass):void {
_someVar = newValue;
}
}
Maintenant, parce que l'AS3 est de retour toujours des références à des classes d'Objet, lorsque nous utilisons la méthode "get" nous obtenir une référence à notre privé var => encapsulation est cassé.
Même si nous n'avons pas une méthode de jeu, nous pouvons modifier la privar var !
Quel est le but de définir comme privé alors?
La seule solution que j'ai trouvé, c'est revenir un clone de "_someVar" dans notre méthode get, mais je n'ai jamais vu cela dans un exemple.
Donc, je pense que je vais perdre quelque chose ici.
Êtes-vous de retour d'un clone de l'objet à partir de votre getters ou que vous venez d'accepter une rupture de l'encapsulation?
MODIFIER
Je comprends comment définir et obtenir des méthodes ne fonctionne, et je comprends les avantages d'entre eux.
Je pose la question pour la pause de "privé" de l'accès à notre private var quand nous le retourner avec un getter par référence (si var est de type Number, String, int, etc AS3 est de retour toujours par valeur, pas de référence, de sorte que nous n'avons pas de problème ici).
Peut-être n'est pas l'encapsulation qui est cassé, parce que nous ne pouvons pas définir la propriété sans une méthode de définition. Mais nous pouvons la modifier !
Voir cet exemple:
public class Foo {
private var _someVar:Array; //note that this is a Object (not Number, String, etc)
public function Foo(){
_someVar = ['don't touch this!'];
}
public function get someVar():SomeClass {
return _someVar;
}
//note that we don't have a setter
}
var f:Foo = new Foo();
var a:Array = f.someVar;
trace(a[0]); // 'don't touch this!'
a[0] = 'why not?';
trace(f.someVar[0]); //'why not'
Donc, nous changeons notre private var à partir de l'extérieur, et sans contrôle, même lorsque nous n'avons pas une méthode de définition.
OriginalL'auteur Enrique | 2011-06-17
Vous devez vous connecter pour publier un commentaire.
Vous êtes en contrôle de l'accès à la variable de membre lorsque vous utilisez get/fonctions de jeu. Par exemple, si vous voulez la variable à "lecture seule" de l'extérieur, mais modifiable à partir de l'intérieur de l'instance de classe vous faire une fonction get de sorte qu'il peut être lu de l'extérieur mais de ne PAS créer une fonction de jeu. C'est différent de l'utilisation d'un private const, parce que cela doit être déclarée immédiatement et ne peut jamais être modifié à partir de n'importe où.
De même, l'utilisation de ces fonctions vous permettent de créer des effets secondaires pour la définition de la propriété. Par exemple:
EDIT : Parce que vous avez mis à jour la question pour être plus précis, voici une mise à jour de mon propre.
Vous le feriez normalement PAS le faire. Si vous essayez de protéger la variable elle-même, alors vous ne serez pas donner accès directement. Faire des pauses "la loi de Déméter". Pour votre exemple avec le tableau, vous pourriez faire quelque chose comme ceci:
Comme un autre exemple, à l'aide d'un théorique objet complexe...
Que la dernière est intéressante, car vous n'avez pas besoin de les exposer au monde que vous êtes en utilisant SomeObject pour faire le travail... vous êtes tout simplement la publicité que vous vous pouvez faire.
J'espère que mon montage permet de répondre à vos questions.
oui, je pense que ça confirme ce que je demande: si nous voulons donner un accès en lecture seule à une propriété et son contenu, il ne suffit pas avec la définition de cette propriété dans le privé et pas de la définition d'un setter, nous avons également besoin de retourner un "copier" (valeur, clone) de notre propriété privée dans notre getter.
OriginalL'auteur scriptocalypse
Vous pouvez modifier la variable privée de l'intérieur de la classe à laquelle il appartient, mais vous ne pouvez pas le modifier à partir de l'extérieur de la classe.
Avoir des accesseurs et des mutateurs vous donne plus de puissance (en tant que développeur) au cours de la classe.
Votre application va grandir et à un certain point, vous pourriez voulez que votre classe soit capable de faire quelque chose avec une valeur avant qu'il ne le récupère ou définit avant. Vous pouvez également voulez que votre classe soit capable d'appeler une méthode à chaque fois il définit une valeur. Des choses comme ça, vous pouvez facilement atteindre lorsque vous avez getter /setter.
En outre, comme TheDarkIn1978 dit, laissant l'une des méthodes, pourrait faire de la variable en lecture seule ou en lecture seule qui serait un énorme avantage pour l'encapsulation.
Ce n'est pas seulement de contrôler quels sont les attributs que les autres classes peuvent accéder. C'est également sur le contrôle des moyens attributs sont accessibles.
exact.
Ce n'est pas vrai, si je n'ai pas de setter, seulement un getter, je peux modifier (pas mis) le private var de toute façon, parce que mon getter est de retourner une référence à ce membre privé n'est pas une copie! Donc, je vais changer le private var à partir de l'extérieur de ma classe, sans contrôle. Peut-être que le mot n'est pas "encapsulation", mais nous sommes en contournant les restrictions d'accès.
oui, vous avez raison, il en va de même pour C#, C++, Java, etc. Ce que vous ne pouvez pas faire est de créer un nouvel objet avec de la lecture, vous avez besoin de la définition pour que.
OriginalL'auteur Emanuil Rusev
J'utilise souvent des getters et setters si j'ai besoin de savoir si cette variable a été modifiée afin de changer d'autres choses.
Par exemple si j'aurais :
et je veux que prop2 être à tout moment = prop + 10, je ne sais pas quand mettre à jour prop2, mais je pourrais faire quelque chose comme ceci:
OriginalL'auteur gabitzish
le code ci-dessus est exactement la même chose que simplement écrit:
si, toutefois, vous avez voulu faire cette variable en lecture seule ou en écriture seule, vous offre publique de lecture publique ou de définition pour la variable privée respectivement.
en outre, les poseurs et les fonctions de lecture vous permettent de gérer les paramètres passés, de déclencher des événements, etc. par exemple, supposons que vous avez une variable
mySmallNumber:Number
qui ne devrait accepter les valeurs inférieures à 10:OriginalL'auteur TheDarkIn1978
Si vous allez pour l'encapsulation, alors vous ne devriez pas fournir un accès direct à des objets complexes (adoptée par le ref). Vous devriez regarder ce que c'est que vous attendez que les autres classes puissent être en mesure de le faire avec votre "SomeClass'. Si vous avez vraiment besoin de passer l'ensemble de la classe et ne veulent pas qu'il soit un ref, puis ajouter une méthode clone. Si vous il suffit de s'attendre à d'autres classes de mise à jour de certaines données qui appartient à 'SomeClass" la fournir setters pour que les données et de les appliquer directement à la "SomeClass" instance. Il nécessite plus de code, mais accomplir le but de l'encapsulation de votre classe.
OriginalL'auteur artjumble