在Ruby类中向子节点发送方法? inheritance混乱

我有以下代码:

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,我希望调用超类的default_chain,因此要启动Exception。 但是,似乎Bike类实际上调用了原始调用者的default_chain方法。 这是为什么?

正如@BorisStitnicky所说,你需要使用singleton_class。 为了更好地理解,在这篇文章中你可能会找到信息: 在别名实例方法时理解单例类

将同名方法放在子类中的重点是重载该方法。 即用新版本替换它。

代码将查看调用子类的任何方法的版本 – 在它开始查找方法的祖先链之前,因为子类是当前代码的上下文

因此,即使该方法在超类中被引用…… ruby​​解释器仍将首先将您的子类的方法集视为主要上下文。

如果你还想调用父类的 – 你也必须在default_chain方法中使用super。 或者将父类中的一个重命名为其他类,并仅从您的超类中调用它。

在面向对象的编程中,调用哪个方法完全由接收器和方法名称决定。

  • 在接收器上调用方法名称initializeMountainBike实例, MountainBike#initialize匹配并执行。
  • 在执行中,调用superBike#initialize匹配并执行。
  • 在执行过程中,在隐式接收器self上调用方法名称default_chain ,它是MountainBike实例。 MountainBike#default_chain匹配并执行。

如果要在接收器的最后一步( MountainBike实例)中调用Bike#default_chain ,则意味着方法调用不仅取决于接收者和方法名称,还取决于上下文。 这会使它变得太复杂,并且会破坏面向对象编程的目的。 同样,面向对象编程的想法是方法调用仅由接收者和方法名称决定,而不是由上下文决定