Méthodes privées dans Ruby:
Si une méthode est privée dans Ruby, elle ne peut pas être appelée par un récepteur (objet) explicite. Il ne peut être appelé qu'implicitement. Il peut être appelé implicitement par la classe dans laquelle il a été décrit ainsi que par les sous-classes de cette classe.
Les exemples suivants l'illustreront mieux:
1) Une classe Animal avec la méthode privée nom_classe
class Animal
def intro_animal
class_name
end
private
def class_name
"I am a #{self.class}"
end
end
Dans ce cas:
n = Animal.new
n.intro_animal #=>I am a Animal
n.class_name #=>error: private method `class_name' called
2) Une sous-classe d'animal appelée amphibien:
class Amphibian < Animal
def intro_amphibian
class_name
end
end
Dans ce cas:
n= Amphibian.new
n.intro_amphibian #=>I am a Amphibian
n.class_name #=>error: private method `class_name' called
Comme vous pouvez le voir, les méthodes privées ne peuvent être appelées qu'implicitement. Ils ne peuvent pas être appelés par des destinataires explicites. Pour la même raison, les méthodes privées ne peuvent pas être appelées en dehors de la hiérarchie de la classe de définition.
Méthodes protégées dans Ruby:
Si une méthode est protégée dans Ruby, elle peut être appelée implicitement à la fois par la classe de définition et ses sous-classes. De plus, ils peuvent également être appelés par un récepteur explicite tant que le récepteur est soi-même ou de la même classe que celui de soi:
1) Une classe animale avec la méthode protégée protect_me
class Animal
def animal_call
protect_me
end
protected
def protect_me
p "protect_me called from #{self.class}"
end
end
Dans ce cas:
n= Animal.new
n.animal_call #=> protect_me called from Animal
n.protect_me #=>error: protected method `protect_me' called
2) Une classe de mammifères héritée d'une classe animale
class Mammal < Animal
def mammal_call
protect_me
end
end
Dans ce cas
n= Mammal.new
n.mammal_call #=> protect_me called from Mammal
3) Une classe d'amphibiens héritée de la classe animale (identique à la classe de mammifères)
class Amphibian < Animal
def amphi_call
Mammal.new.protect_me #Receiver same as self
self.protect_me #Receiver is self
end
end
Dans ce cas
n= Amphibian.new
n.amphi_call #=> protect_me called from Mammal
#=> protect_me called from Amphibian
4) Une classe appelée Tree
class Tree
def tree_call
Mammal.new.protect_me #Receiver is not same as self
end
end
Dans ce cas:
n= Tree.new
n.tree_call #=>error: protected method `protect_me' called for #<Mammal:0x13410c0>
Object
étaient autorisées à appeler les méthodes privées de toutes les autres instances deObject
, il serait possible de dire des choses comme5.puts("hello world")
.