在下面的程序中,子类的方法调用父类的私有方法。
class Parent
private
def new_name
'Private Method'
end
end
class Child < Parent
def get_parent_name
puts new_name
end
end
obj = Child.new
obj.get_parent_name
Ruby被认为是面向对象的语言所以行
puts new_name
访问父类的私有方法。在内部,它如何调用该方法?作为面向对象的编程语言,它应该使用对象来调用它。但是对象无法访问私有方法。
答案 0 :(得分:0)
Ruby中的私有方法是继承的。因此,如果您为Parent
定义私有方法,它也会出现在Child
中。
答案 1 :(得分:0)
回答你对第一个答案的评论。
对类中的当前实例有隐式引用。在puts new_name
内进行get_parent_name
时,您正在做的是在当前实例上调用new_name
。
事实上,当你说private
Ruby所做的是避免使用显式对象引用来调用方法时。
class Klass
private
def new_name
'Private Method'
end
def new_name_pub__wrong
self.new_name # won't work since using an explicit object reference
end
def new_name_pub__ok
new_name # will work but means basically the same as self.new_name
end
end
然后在你的情况下,这只是基本的OOP
实例上的子调用new_name
(如上所述),找不到它会抓取继承层次结构并找到父new_name
(私有方法对所有子类都可见)
答案 2 :(得分:0)
在Ruby中,您可以隐式接收接收器,在这种情况下隐含为self
。这类似于Self,Java,C#,Scala和许多其他面向对象的语言,而不像Smalltalk,它总是需要一个明确的接收器。
此外,您似乎完全没有理解如何调用从puts
继承的私有Kernel
方法,但puts
和new_name
之间没有区别那你为什么遇到一个而不是另一个呢?
答案 3 :(得分:0)