0

クラス継承とともにモジュールが含まれている場合、ルックパスは「スーパー」を呼び出す場所をどのように決定しますか。私の推測では、デフォルトではモジュールの初期化メソッドが使用されます。これは正しいです?もしそうなら、代わりに継承されたクラスで初期化メソッドを使用するようにコードに明示的に指示するにはどうすればよいでしょうか?

以下は一例です。

Employee クラスが Subject ではなく Other から initialize を継承するようにします。

  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

私の推測では、デフォルトではモジュールの初期化メソッドが使用されます。

正しい。クラスにモジュールが含まれている場合、そのモジュールのメソッドは、同じ名前の継承されたメソッドを置き換えます。

もしそうなら、代わりに継承されたクラスで初期化メソッドを使用するようにコードに明示的に指示するにはどうすればよいでしょうか?

この問題が発生しないように、リファクタリングを行うのがおそらく最善です。

ただし、 Subjectの代わりにOtherの initialize メソッドを呼び出す方法はいくつかあります。

このようなものはどうですか:

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の initialize メソッドが呼び出されることがわかります。ただし、このようなコードを書くのは得策ではありません。

于 2012-07-18T02:16:47.500 に答える