我有以下Ruby代码:
class B
class << self
protected
def prot
puts "victory"
end
end
end
class C < B
def self.met
C.prot
end
end
C.met
试图证明受保护的类方法是在Ruby中继承的。问题是,如果我将met方法转换为这样的实例方法:
class B
class << self
protected
def prot
puts "victory"
end
end
end
class C < B
def met
C.prot
end
end
c = C.new
c.met
它不会工作。也许它与类和实例方法范围有关?
答案 0 :(得分:1)
它无法正常工作,因为C
的实例不是kind_of?(B.singleton_class)
。
在ruby中,可以在对象的上下文中调用受保护的方法,该对象是kind_of?
定义方法的类,使用显式接收器kind_of?
定义方法的类
您在B
的单例类上定义了受保护的方法,因此该方法只能在kind_of?(B.singleton_class)
的对象中调用。课程C
继承B
,因此C
的单身类会继承B
的单身类,因此C
为{{{ 1}}。因此,在您的第一种情况下,它是有效的但很明显,kind_of? B.singleton_class
不是C.new
,所以它不会起作用。
答案 1 :(得分:0)
对于Protected方法,我们可以从属于同一个类的任何对象的范围调用它们。在您的代码片段中,根据类的范围,方法查找链选择该方法,因为它继承到超类。这意味着,您在Singleton类中定义一个方法意味着我们可以通过使用该类的对象来调用它。所以我们可以用A和B的对象来调用它,因为B对象是从A继承的。
总之,您可以在类的公共方法中调用受保护的方法。 请参阅以下网址以获得更好的理解
答案 2 :(得分:0)
我认为这与将.protegido
方法声明为元类(或单例类)的一部分而不是作为B类本身的一部分的区别有关。