据我了解,您想在内部覆盖A#foo
(也被. 但是,您只想在内部覆盖它,而不是在mixin 中的代码。B#bar
MyClass
MyClass
B
这里要理解的是,当A
和B
mixins 的代码运行时,它们将成为MyClass
实例的一部分。因此,不可能在MyClass
不影响 mixins 的情况下覆盖实例方法。就好像 mixins 的方法被扔进一个桶(MyClass
实例),然后运行。它们没有单独的范围。因此,简单的答案是:不,你做不到。
不过,可能有几种可能的解决方案,其中许多闻起来像意大利面。遇到这样的问题可能表明整体设计决策需要一些重构。
回顾模块的基础知识:
module Numbered
DEFAULT = "1234-AWESOME"
def serial_number
DEFAULT
end
def self.awesome?
true
end
end
Numbered.awesome? # => true
Numbered.serial_number # whoops! NoMethodError.
o = Object.new
o.extend(Numbered)
o.serial_number #=> "1234-AWESOME"
Numbered.extend(Numbered)
Numbered.serial_number # => "1234-AWESOME"
class Dog
extend Numbered
end
Dog.serial_number # => "1234-AWESOME"
Dog::DEFAULT # => "1234-AWESOME"
fido = Dog.new
fido.serial_number # NoMethodError!
这是因为该方法是作为类方法添加的。include
救援:
class Fish
include Numbered
def serial_number
super + '-FSH'
end
end
cod = Fish.new
cod.serial_number # => "1234-AWESOME-FSH"
因此,include
将所有方法堆放在一个公共实例中,但我们仍然可以使用它super
来调用我们覆盖的包含方法。如果您在意大利面方面寻求解决方案,您可能可以在bar
方法内部使用 super ,有条件地调用您覆盖的方法。
此外,根据具体情况,您可以设置一个新模块,extend
并使用包含您需要访问的方法的模块,就像您添加的答案一样。