在Ruby中调用超级方法

在Ruby中调用超级方法,ruby,inheritance,methods,super,derived,Ruby,Inheritance,Methods,Super,Derived,我试图在Ruby中定义一些具有继承层次结构的类,但我想在派生类中使用基类中的方法之一。问题是我不想调用我使用的确切方法,我想调用另一个方法。以下内容不起作用,但这正是我想要做的(基本上) A类 德福 放置“A::foo” 终止 终止 B类A::foo 也许,这就是你想要的 class A def foo puts 'A::foo' end end class B < A alias bar :foo def foo puts 'B::foo' end

我试图在Ruby中定义一些具有继承层次结构的类,但我想在派生类中使用基类中的方法之一。问题是我不想调用我使用的确切方法,我想调用另一个方法。以下内容不起作用,但这正是我想要做的(基本上)

A类
德福
放置“A::foo”
终止
终止
B类
也许,这就是你想要的

class A
  def foo
    puts 'A::foo'
  end
end

class B < A
  alias bar :foo
  def foo
    puts 'B::foo'
  end
end

B.new.foo # => B::foo
B.new.bar # => A::foo
A类
德福
放置“A::foo”
终止
终止
B类B::foo
B.new.bar#=>A::foo

也许,这就是你想要的

class A
  def foo
    puts 'A::foo'
  end
end

class B < A
  alias bar :foo
  def foo
    puts 'B::foo'
  end
end

B.new.foo # => B::foo
B.new.bar # => A::foo
A类
德福
放置“A::foo”
终止
终止
B类B::foo
B.new.bar#=>A::foo

一个更通用的解决方案

class A
  def foo
    puts "A::foo"
  end
end

class B < A
  def foo
    puts "B::foo"
  end
  def bar
    # slightly oddly ancestors includes the class itself
    puts self.class.ancestors[1].instance_method(:foo).bind(self).call
  end
end

B.new.foo # => B::foo
B.new.bar # => A::foo
A类
德福
放入“A::foo”
终止
终止
B类B::foo
B.new.bar#=>A::foo

一个更通用的解决方案

class A
  def foo
    puts "A::foo"
  end
end

class B < A
  def foo
    puts "B::foo"
  end
  def bar
    # slightly oddly ancestors includes the class itself
    puts self.class.ancestors[1].instance_method(:foo).bind(self).call
  end
end

B.new.foo # => B::foo
B.new.bar # => A::foo
A类
德福
放入“A::foo”
终止
终止
B类B::foo
B.new.bar#=>A::foo

哦,嘿。那真方便。所以它是
别名#{new}:#{old}
?对。关键是,
alias
是动态计算的。因此,如果将
alias
放在
B#foo
的定义之后,它将不起作用。它将变成
B#foo
。哦,嘿。那真方便。所以它是
别名#{new}:#{old}
?对。关键是,
alias
是动态计算的。因此,如果将
alias
放在
B#foo
的定义之后,它将不起作用。它将变成
B#foo