从超类调用Ruby保护的可见性
我有一个小代码,它似乎在某种程度上相互矛盾: 第二个可见性受保护。调用受保护方法时,发送方必须是接收方的子类,或者接收方必须是发送方的子类。否则将引发从超类调用Ruby保护的可见性,ruby,protected,nomethoderror,Ruby,Protected,Nomethoderror,我有一个小代码,它似乎在某种程度上相互矛盾: 第二个可见性受保护。调用受保护方法时,发送方必须是接收方的子类,或者接收方必须是发送方的子类。否则将引发NoMethodError 类测试 def publico(otro) 奥特罗·普洛特 结束 结束 Hija类1——接收方d是发送方c的子类 我们可能会得出这样的结论:这种行为类似于“发送者或接收者必须继承了该方法”。有了这一点,我们可以解释,由于A(不知道m的存在)和B(知道m的存在但不继承它)都没有继承该方法,因此会产生错误 尽管这也可能是一
NoMethodError
类测试
def publico(otro)
奥特罗·普洛特
结束
结束
Hija类<试验
受保护的def保护;结束
结束
Test.new.publico(Hija.new)
我得到以下输出:
NoMethodError:为调用受保护的方法'prot'#
阳具
我错过了什么?显然,“接收方必须是发送方的子类”选项不可用。虽然它不适用于对受保护方法一无所知的父类,但它适用于定义受保护方法的子类的子类。例如
class A
def n(other)
other.m
end
end
class B < A
def m
1
end
protected :m
end
class C < B
end
class D < C
end
a = A.new
b = B.new
c = C.new
d = C.new
c.n b #=> 1 -- sender C is a subclass of B
b.n b #=> 1 -- m called on defining class
a.n b # raises NoMethodError although reciever B is a subclass of sender A
b.n c #=> 1 -- reciever C is subclass of sender B
c.n d #=> 1 -- reciever D is sublcass of sender C
A类
def n(其他)
其他
结束
结束
B类1——发送方c是b的一个子类
b、 在定义类时调用nb#=>1--m
a、 nb#虽然receiver b是sender a的一个子类,但它会引起命名错误
b、 nC#=>1——接收器c是发送器b的子类
c、 n d#=>1——接收方d是发送方c的子类
我们可能会得出这样的结论:这种行为类似于“发送者或接收者必须继承了该方法”。有了这一点,我们可以解释,由于A(不知道m的存在)和B(知道m的存在但不继承它)都没有继承该方法,因此会产生错误
尽管这也可能是一个bug。受保护的方法只能从同一类或子类的实例中调用。Hija是Test的一个子类。Test不是Hija的一个子类。所以Hija中的受保护方法对测试实例不可用 如果你的例子是另一种方式:
class Hija
protected def prot; end
end
class Test < Hija
def publico(otro)
otro.prot
end
end
Test.new.publico(Hija.new)
class-Hija
受保护的def保护;结束
结束
等级测试
工作正常。您编写的代码实际上不是您的原始代码。它对应于文档示例中的
a.n b
案例,该案例引发了异常,如前所述。文档中存在冲突(在这方面,您的问题有点误导,但提出了一个很好的观点)。
class Hija
protected def prot; end
end
class Test < Hija
def publico(otro)
otro.prot
end
end
Test.new.publico(Hija.new)