繁体   English   中英

发送方法给孩子在Ruby类? 继承混乱

[英]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与之匹配,并被执行。
  • 在执行过程中,将调用superBike#initialize与之匹配并执行super
  • 在执行过程中,方法名称default_chain在隐式接收者self上调用,该接收者为MountainBike实例。 MountainBike#default_chain匹配,并被执行。

如果在接收者的最后一步( MountainBike实例)中调用Bike#default_chain ,则意味着方法调用不仅取决于接收者和方法名称,还取决于上下文。 这将使其变得过于复杂,并且将无法达到面向对象编程的目的。 再次,面向对象编程的思想是方法调用仅由接收方和方法名称而不是上下文确定

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM