Ruby中如何在派生类的其他方法中调用被重写的基类方法?
如何在派生类的其他方法中调用基类已被重写的方法?
你遇到的问题核心是:派生类Derived重写了基类Base的实例方法a后,直接用Base.a调用会报错——因为a是实例方法,而Base.a是试图调用类方法,两者不属于同一范畴。
下面提供几种可行的解决办法:
方法一:绑定基类实例方法到当前对象调用
通过instance_method获取基类的实例方法,再用bind绑定当前实例,最后执行调用:
class Base def a puts "hi, this is Base.a" end end class Derived < Base def a puts "hi, this is Derived.a" end def b # 绑定基类的a方法到当前实例并执行 Base.instance_method(:a).bind(self).call end end # 测试验证 d = Derived.new d.b # 输出: hi, this is Base.a d.a # 输出: hi, this is Derived.a
方法二:用辅助方法封装super调用
如果需要多次调用基类的a方法,可以在派生类中定义一个辅助方法,通过super直接触发基类的实现:
class Base def a puts "hi, this is Base.a" end end class Derived < Base def a puts "hi, this is Derived.a" end def base_a super # 此处super会直接调用基类的a方法 end def b base_a end end # 测试验证 d = Derived.new d.b # 输出: hi, this is Base.a
方法三:通过超类方法调用
也可以通过self.class.superclass获取基类,再调用对应的实例方法:
class Base def a puts "hi, this is Base.a" end end class Derived < Base def a puts "hi, this is Derived.a" end def b self.class.superclass.instance_method(:a).call(self) end end # 测试验证 d = Derived.new d.b # 输出: hi, this is Base.a
三种方法中,方法一适合单次调用场景,直接高效;方法二更具可读性,适合需要重复调用的场景。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

