从超类构造函数中的子类调用方法 - 谜语

时间:2014-06-23 12:18:21

标签: ruby metaprogramming

我想在subclass中调用superclass方法,但我不知道如何。

我不想做这样的事情:

class A

  def initialize
    run
  end

  def run
    p "RUN"
    @runned = true
    method_from_b
  end

end

class B < A

  def method_from_b
    p @runned
  end

end

b = B.new

但更棘手

class A

  def self.create
    B.new # here I want to create a instance
  end

  create # call create

  def initialize
    run
  end

  def run
    p "RUN"
    @runned = true
    method_from_b
  end

end

class B < A

  def method_from_b
    p @runned
  end

end

我知道里面有什么问题,但我怎样才能实现这个功能呢? 我希望superclass中的方法总是从子类调用方法但没有显式实例创建(通过new)。
如果它不可能,那么.. Test::Unit::TestCase如何运作? 要运行测试,我可以编写cmd: ruby test.rb,TestCase会从测试类中获取所有方法明星test_
这正是我需要的。

编辑:

我想我已经明白了:

file1.rb

require_relative 'file2'

class B
  def initialize
    p "A#initialize"
  end

  def method_from_b
    p @runned
  end
end

file2.rb

module M

  def run
    p "RUN"
    @runned = true
    method_from_b
  end
end


class A

  def self.create
    p "create"
    require $0
    B.send(:include, M)
    a = B.new
    a.run
  end

  create

end

它有效

0 个答案:

没有答案