Закрытые методы в Ruby:
Если метод является закрытым в Ruby, то он не может быть вызван явным получателем (объектом).Это можно только назвать неявно.Он может неявно вызываться классом, в котором он был описан, а также подклассами этого класса.
Следующие примеры иллюстрируют это лучше:
1) Класс Animalс закрытым методом имя_класса
class Animal
def intro_animal
class_name
end
private
def class_name
"I am a #{self.class}"
end
end
В этом случае:
n = Animal.new
n.intro_animal #=>I am a Animal
n.class_name #=>error: private method `class_name' called
2) Подкласс Animal под названием Amphibian:
class Amphibian < Animal
def intro_amphibian
class_name
end
end
В этом случае:
n= Amphibian.new
n.intro_amphibian #=>I am a Amphibian
n.class_name #=>error: private method `class_name' called
Как видите, закрытые методы можно вызывать только неявно.Они не могут быть вызваны явными получателями.По той же причине частные методы не могут быть вызваны вне иерархии определяющего класса.
Защищенные методы в Ruby:
Если метод защищен в Ruby, то он может быть вызван неявно с помощьюи определяющий класс и его подклассы.Кроме того, они также могут вызываться явным получателем, если получатель является self или того же класса, что и self:
1) Класс Animal с защищенным методом protect_me
class Animal
def animal_call
protect_me
end
protected
def protect_me
p "protect_me called from #{self.class}"
end
end
В этом случае:
n= Animal.new
n.animal_call #=> protect_me called from Animal
n.protect_me #=>error: protected method `protect_me' called
2) Класс млекопитающих, унаследованный от класса животных
class Mammal < Animal
def mammal_call
protect_me
end
end
В этом случае
n= Mammal.new
n.mammal_call #=> protect_me called from Mammal
3) Класс амфибииунаследовано от класса животных (аналогично классу млекопитающих)
class Amphibian < Animal
def amphi_call
Mammal.new.protect_me #Receiver same as self
self.protect_me #Receiver is self
end
end
В этом случае
n= Amphibian.new
n.amphi_call #=> protect_me called from Mammal
#=> protect_me called from Amphibian
4) Класс под названием Tree
class Tree
def tree_call
Mammal.new.protect_me #Receiver is not same as self
end
end
В этом случае:
n= Tree.new
n.tree_call #=>error: protected method `protect_me' called for #<Mammal:0x13410c0>