通过混合模块来覆盖类的实例方法

Joe*_*e V 0 ruby overriding module mixins

给定A类和模块B,混合B的实例方法,使其覆盖A的相应实例方法.

module B
  def method1
    "B\#method1"
  end

  def method2
    "B\#method2"
  end
end

class A
  def method1
    "A\#method1"
  end

  def method2
    "A\#method2"
  end

  # include B    does not override instance methods!
  #              (module gets mixed into the superclass)
end

puts A.new.method1   # want it to print out "B#method1"
puts A.new.method2   # want it to print out "B#method2"
Run Code Online (Sandbox Code Playgroud)

Jör*_*tag 7

Module#include插入模块M作为一个超类的类C.所以,你不能覆盖C的方法M,而是反过来:C方法覆盖M的方法.(从技术上讲,Ruby没有做M的超类C,而是创建了一个无形的包括类 ?M??,其方法表和常数表点M的方法表和常数表,并使得类别的父类,但这种区别并不重要这个特殊的问题.)

在Ruby 2.0,有一个新的方法,Module#prepend其中,正如其名称所暗示,预先考虑 MC的祖先,换句话说,使得M一个子类C.

所以,简而言之:你不能,至少还没有.