Ruby 请教一下,ruby 中能否复制某个 class 的方法到当前 class 中

doraemon0711 · 2025年01月22日 · 最后由 zerzerheart 回复于 2025年01月22日 · 45 次阅读

举个例子 以下是个父类

class Base
  attr_accessor :flag
  def exec; raise NotImplementedError; end
  def print_flag; print("#{self.class} - #{flag}"); end
end

这时有个子类BizA继承了Base,并实现了exec

class BizA < Base
  def exec; self.flag = true; self; end
end

现在如果执行BizA.new.exec.print_flag,会输出BizA - true 上面是前提

我的问题是,如果有领个子类BIzB,能否在BizB继承Base的情况下,拥有和 BizA 相同实现的exec方法

class BizB < Base
  # 不去实现exec,而是复制BizA的exec到当前class
end

然后在执行BizB.new.exec.print_flag时,输出BizB - true

我知道的几种方式在这里列一下,但不是我想要的效果

  1. BizB 继承 BizA - 这种方式确实能正确输出想要的结果,但在我看来 BizB 和 BizA 实际上是同级的,只不过 BizB 委托 BizA 中的方法去进行处理,是在没有别的办法的话我会采取该方案
  2. 使用 DelegateClass 委托 - 这样做不符合需求,因为在执行BizB.new.exec.print_flag时,必须要提供一个 BizA 的实例,而 exec 内部获取 self 时获取到的也是 BizA 的实例,会出现问题
  3. 将 exec 抽到 module 中使用 include 的方式 - 这样做有些偏离初衷了,并且改动加到,我当前的场景是在实现Base的基类,给用户继承使用,Base中还有很多其他的方法和属性,所以不考虑

抽到 module 中不影响 BizABizB 继承 Base 吧?其它代码继续放在 Base 里就好了。

如果 module 只是 BizABizB 共有的,那就只给它俩用这个 module 就完了。

你想做的事情应该是把 exec 方法所在的类加入 BizB 的方法查找链里,ruby 有继承、include、extend、prepend 来改变一个类的方法查找链,在不使用以上方式的情况下应该是没办法做到的将 BizA 加到 BizB 的方法查找链中的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号