0

如果我有一个与类继承一起包含的模块,那么外观路径如何决定在哪里调用“super”。我的预感是默认情况下它将使用模块中的初始化方法。它是否正确?如果是这样,我如何明确告诉代码使用继承类中的初始化方法?

下面贴出一个例子:

我希望 Employee 类从 Other 而不是 Subject 继承初始化。

  module Subject
    def initialize
      @observers = []
    end
  end

  class Other
    def initialize
      @other_stuff = []
    end
  end

  class Employee < Other
    include Subject 

    attr_reader :name

    def initialize(name)
     super()
    end
  end
4

1 回答 1

1

我的预感是默认情况下它将使用模块中的初始化方法。

正确的。如果一个类包含一个模块,那么该模块的方法将替换继承的同名方法。

如果是这样,我如何明确告诉代码使用继承类中的初始化方法?

您可能最好进行重构,以免遇到此问题。

但是,有几种方法可以让Other的 initialize 方法被调用而不是Subject的。

像这样的东西怎么样:

module Subject
  def initialize
    puts "subject initialize"
    @observers = []
  end
end

class Other
  def initialize
    puts "other initialize"
    @other_stuff = []
  end
end

class Employee < Other

  alias_method :other_initialize, :initialize

  include Subject

  attr_reader :name

  def initialize(name)
    other_initialize
  end
end

Employee.new('test')

如果你运行它,你会看到Other的初始化方法被调用了。然而,编写这样的代码并不是一个好主意。

于 2012-07-18T02:16:47.500 回答