Pourquoi Ruby ont à la fois privé et protégé méthodes?
Avant que j'ai lu cet article, je pensais que le contrôle d'accès dans Ruby a travaillé comme ceci:
public
- peut être consulté par n'importe quel objet (par exemple,Obj.new.public_method
)protected
- ne peut être consulté à partir de l'objet lui-même, ainsi que toutes les sous-classesprivate
- même protégé, mais la méthode n'existe pas dans les sous-classes
Cependant, il semble que protected
et private
agir de la même, sauf pour le fait que vous ne pouvez pas appeler private
méthodes explicitement avec un récepteur (c'est à dire self.protected_method
fonctionne, mais self.private_method
ne marche pas).
Quel est le point de tout cela? Quand il y a un scénario si vous ne voulez pas que votre méthode appelée explicitement avec un récepteur?
- Si toutes les instances de
Object
ont été autorisés à appeler les méthodes privées de toute autre instance deObject
, il serait possible de dire des choses comme5.puts("hello world")
.
Vous devez vous connecter pour publier un commentaire.
protected
méthodes peuvent être appelées par une instance de la classe de définition ou de ses sous-classes.private
méthodes peuvent être appelées qu'à partir de l'objet appelant. Vous ne pouvez pas accéder à une autre instance privée de méthodes directement.Voici un petit exemple pratique:
some_method
ne peut pas êtreprivate
ici. Il doit êtreprotected
parce que vous avez besoin de soutien explicite des récepteurs. Votre intérieur typique des méthodes d'assistance peuvent généralement êtreprivate
puisqu'ils n'ont jamais besoin d'être appelé comme ça.Il est important de noter que ceci est différent de la façon dont Java ou C++ fonctionne.
private
en Ruby, c'est similaire àprotected
en Java/C++ dans les sous-classes ont accès à cette méthode. En Ruby, il n'existe aucun moyen de restreindre l'accès à une méthode à partir de ses sous-classes comme vous le pouvez avecprivate
en Java.Visibilité en Ruby, c'est en grande partie une "recommandation" de toute façon puisque vous pouvez toujours accéder à une méthode utilisant
send
:private
vsprotected
avait à faire si une sous-classe peut hériter d'une méthode, mais c'est en fait sur le fait que la méthode peut être appelée à partir. Merci!send
?La différence
self
. Même vous ne peut pas appelerself.some_private_method
; vous devez appelerprivate_method
avecself
implicite. (iGEL souligne: "Il n'y a toutefois une exception. Si vous avez une méthode privée âge=, vous pouvez (et devez) appeler avec des auto de le séparer de variables locales.")En Ruby, ces distinctions sont juste des conseils d'un programmeur à l'autre. Non-méthodes publiques sont une façon de dire "je me réserve le droit de modifier la présente; ne dépend pas d'elle." Mais vous obtenez toujours les ciseaux pointus de
send
et peut appeler n'importe quelle méthode que vous aimez.Un bref tutoriel
Ensuite, vous pouvez exécuter
ruby dwarf.rb
et ce faire:age=
, vous pouvez (et devez) appeler avecself
à séparer les variables locales.gimli.greet
,gimli
n'est pas l'appelant, mais le récepteur. L'appelant est le "haut-niveau de l'environnement d'exécution", qui est en fait une instance ad-hoc deObject
. Essayez ceci:ruby -e 'p self; p self.class'
Méthodes privées en Ruby:
Si une méthode est privé, Ruby, alors il ne peut pas être appelé par un explicite récepteur (objet). Il ne peut être appeler implicitement. Il peut être appelé implicitement par la classe dans laquelle il a été décrit en tant que bien que par les sous-classes de cette classe.
Les exemples suivants illustrent mieux:
1) Un Animal de la classe avec une méthode privée class_name
Dans ce cas:
2) Une sous-classe de l'Animal appelé Amphibiens:
Dans ce cas:
Comme vous pouvez le voir, les méthodes privées ne peut être appelé qu'implicitement. Ils ne peuvent pas être appelé explicitement par les récepteurs. Pour la même raison, les méthodes privées ne peut pas être appelé en dehors de la hiérarchie de la classe de définition.
Protégé Méthodes de Ruby:
Si une méthode est protégé en Ruby, alors il peut être appelé implicitement par à la fois la définition de la classe et de ses sous-classes. En outre, ils peuvent aussi être appelés par un explicite récepteur tant que le récepteur est de l'auto ou de la même classe que celle de l'auto:
1) Un Animal de la classe avec une méthode protégée protect_me
Dans ce cas:
2) Une classe des mammifères qui est héritée de l'animal de la classe
Dans ce cas
3) Un amphibien de la classe héritée de l'Animal de la classe (même en tant que classe mammifère)
Dans ce cas
4) Une classe appelée Arbre
Dans ce cas:
Envisager une méthode privée en Java. Elle peut être appelée à partir de l'intérieur de la même classe, bien sûr, mais elle peut également être appelée par une autre instance de la même classe:
Donc, si l'appelant est un autre exemple de ma classe, ma méthode est en fait accessible à partir de l ' "extérieur", pour ainsi dire. De ce fait, il est semble pas du tout privé.
En Rubis, d'autre part, une méthode privée est vraiment censé être privé, uniquement à l'instance en cours. C'est ce que la suppression de l'option explicite le récepteur fournit.
D'autre part, je voudrais souligner que c'est assez commune dans la communauté Ruby de ne pas utiliser ces contrôles de visibilité à tous, étant donné que Ruby vous donne les moyens de les contourner, de toute façon. À la différence dans le monde Java, la tendance est de tout rendre accessible et de faire confiance à d'autres développeurs de ne pas visser les choses.
Comparaison des contrôles d'accès de Java contre Ruby: Si la méthode est déclarée privé en Java, il ne peut être accédé que par d'autres méthodes dans la même classe. Si une méthode est déclarée protégée, il peut être consulté par d'autres classes qui existent dans le même package ainsi que par les sous-classes de la classe dans un package différent. Lorsqu'une méthode est public, il est visible par tout le monde. En Java, le contrôle d'accès visibilité concept dépend de l'endroit où ces classes mensonge est dans l'héritage/paquet hiérarchie.
Alors que dans le Rubis, la hiérarchie d'héritage ou le module ne fonctionne pas. Il est tout au sujet de l'objet qui est le récepteur d'une méthode.
Pour une méthode privée en Ruby, il ne peut jamais être appelée explicitement avec un récepteur. Nous pouvons (uniquement), appelez la méthode privée avec un récepteur implicite.
Cela signifie également que nous pouvons appeler une méthode d'une classe, il est déclaré en tant que bien que toutes les sous-classes de cette classe.
Vous pouvez ne jamais appeler la méthode privée de l'extérieur de la hiérarchie de classe où il a été défini.
Protégé méthode peut être appelée avec un récepteur implicite, comme privé. En outre protégé méthode peut aussi être appelée par un explicite récepteur (uniquement) si le récepteur est "auto" ou "un objet de la même classe".
Résumé
Public: Public les méthodes de maximum de visibilité
De la protection: Protégé méthode peut être appelée avec un récepteur implicite, comme privé. En outre protégé méthode peut aussi être appelée par un explicite récepteur (uniquement) si le récepteur est "auto" ou "un objet de la même classe".
Privé: Pour une méthode privée en Ruby, il ne peut jamais être appelée explicitement avec un récepteur. Nous pouvons (uniquement), appelez la méthode privée avec un récepteur implicite. Cela signifie également que nous pouvons appeler une méthode d'une classe, il est déclaré en tant que bien que toutes les sous-classes de cette classe.
Partie de la raison pour laquelle les méthodes privées peuvent être accessibles par des sous-classes en Ruby, c'est que Ruby héritage avec des classes est mince sugarcoating sur le Module comprend Ruby, une classe, en fait, est une sorte de module qui fournit de l'héritage, etc.
http://ruby-doc.org/core-2.0.0/Class.html
Ce que cela signifie, c'est que, fondamentalement, une sous-classe "comprend" la classe parent, de sorte que effectivement le parent de la classe de fonctions, privé, y compris les fonctions, sont définies dans la sous-classe ainsi.
Dans d'autres langages de programmation, l'appel d'une méthode consiste à entrer le nom de la méthode d'une classe parent de la hiérarchie et de trouver la première classe parent qui répond à la méthode. En revanche, en Ruby, tandis que la classe parent de la hiérarchie est toujours là, le parent de la classe de méthodes sont directement inclus dans la liste des méthodes de la sous-classe a défini.