[英]Sending method to child in Ruby class? Inheritance confusion
我有以下代码:
class Bike
attr_reader :chain
def initialize
@chain = default_chain
end
def default_chain
raise 'SomeError'
end
end
class MountainBike < Bike
def initialize
super
end
def default_chain
4
end
end
mb = MountainBike.new
p mb.chain
在初始化中我们调用super时,我希望super类的default_chain被调用,因此将启动Exception。 但是,似乎Bike类实际上可以调用原始调用者的default_chain方法。 这是为什么?
正如@BorisStitnicky所说,您需要使用singleton_class。 为了获得更多理解,您可以在本文中找到以下信息: 别名化实例方法时理解单例类
将同名方法放在子类中的目的是使该方法重载。 即用您的新版本替换它。
该代码将查看任何方法的调用子类的版本-在开始查找方法的祖先链之前,因为该子类是当前代码的上下文 。
因此,即使该方法在超类中被引用...红宝石解释器仍将首先将您的子类的方法集视为主要上下文。
如果您还想调用父级的父级-您也必须在default_chain方法中使用super。 或者,将父类中的一个重命名为其他名称,然后仅从您的超类中调用它。
在面向对象的编程中,调用哪种方法完全由接收方和方法名称确定。
initialize
在接收方上调用: MountainBike
实例, MountainBike#initialize
与之匹配,并被执行。 super
, Bike#initialize
与之匹配并执行super
。 default_chain
在隐式接收者self
上调用,该接收者为MountainBike
实例。 MountainBike#default_chain
匹配,并被执行。 如果在接收者的最后一步( MountainBike
实例)中调用Bike#default_chain
,则意味着方法调用不仅取决于接收者和方法名称,还取决于上下文。 这将使其变得过于复杂,并且将无法达到面向对象编程的目的。 再次,面向对象编程的思想是方法调用仅由接收方和方法名称而不是上下文确定 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.