首页 > 解决方案 > super() 调用后将范围限制为父级

问题描述

我有如下所示的内容:

class A
  def foo
    bar
  end

  def bar
    puts "A"
  end
end

class B < A
  def foo
    super
  end

  def bar
    puts "B"
  end
end

所需的输出是能够调用B.new.foo #=> "A". 一旦调用 super ,是否可以将范围限制为父级?这对我来说有点不对劲,所以也许这表明设计不好,但我很好奇这是否可能无论如何。

标签: ruby

解决方案


这里的问题是B定义了一种新bar方法来取代A. 如果您需要保留旧行为,则必须为此创建一个别名:

class A
  def foo
    original_bar
  end

  def bar
    puts "A"
  end
  alias_method :original_bar, :bar
end

class B < A
  def foo
    super
  end

  def bar
    puts "B"
  end
end

在此处使用alias_method保留了子类未覆盖的原始方法的“副本”。

不过,您是对的,这有点混乱。您可能想要声明barprivate这样它就不会那么容易被否决。


推荐阅读