Ruby'de özel yöntemler:
Ruby'de bir yöntem özelse, açık bir alıcı (nesne) tarafından çağrılamaz. Sadece dolaylı olarak çağrılabilir. İçinde anlatıldığı sınıf ve bu sınıfın alt sınıfları dolaylı olarak çağrılabilir.
Aşağıdaki örnekler bunu daha iyi gösterecektir:
1) Özel yöntem class_name olan bir Animal sınıfı
class Animal
def intro_animal
class_name
end
private
def class_name
"I am a #{self.class}"
end
end
Bu durumda:
n = Animal.new
n.intro_animal #=>I am a Animal
n.class_name #=>error: private method `class_name' called
2) Amfibi adı verilen bir Hayvan alt sınıfı:
class Amphibian < Animal
def intro_amphibian
class_name
end
end
Bu durumda:
n= Amphibian.new
n.intro_amphibian #=>I am a Amphibian
n.class_name #=>error: private method `class_name' called
Gördüğünüz gibi, özel yöntemler yalnızca dolaylı olarak çağrılabilir. Açık alıcılar tarafından çağrılamazlar. Aynı nedenle, özel yöntemler tanımlayıcı sınıfın hiyerarşisinin dışında çağrılamaz.
Ruby'de Korumalı Yöntemler:
Bir yöntem Ruby'de korunuyorsa, hem tanımlayıcı sınıf hem de alt sınıfları tarafından dolaylı olarak çağrılabilir. Ayrıca, alıcı kendiliğinden veya kendisiyle aynı sınıfta olduğu sürece açık bir alıcı tarafından da çağrılabilir:
1) Korumalı yöntemi olan bir hayvan sınıfı
class Animal
def animal_call
protect_me
end
protected
def protect_me
p "protect_me called from #{self.class}"
end
end
Bu durumda:
n= Animal.new
n.animal_call #=> protect_me called from Animal
n.protect_me #=>error: protected method `protect_me' called
2) Hayvan sınıfından miras alınan bir memeli sınıfı
class Mammal < Animal
def mammal_call
protect_me
end
end
Bu durumda
n= Mammal.new
n.mammal_call #=> protect_me called from Mammal
3) Hayvan sınıfından miras alınan bir amfibi sınıfı (memeli sınıfı ile aynı)
class Amphibian < Animal
def amphi_call
Mammal.new.protect_me #Receiver same as self
self.protect_me #Receiver is self
end
end
Bu durumda
n= Amphibian.new
n.amphi_call #=> protect_me called from Mammal
#=> protect_me called from Amphibian
4) Ağaç adı verilen bir sınıf
class Tree
def tree_call
Mammal.new.protect_me #Receiver is not same as self
end
end
Bu durumda:
n= Tree.new
n.tree_call #=>error: protected method `protect_me' called for #<Mammal:0x13410c0>
Object
diğer her örneğinin özel yöntemlerini çağırmasına izin verilirseObject
, böyle şeyler söylemek mümkün olurdu5.puts("hello world")
.