检查方法是否在* this *类中定义

时间:2012-10-08 01:59:29

标签: ruby

我有以下代码。它实际上是三个独立的脚本,除了我把它们组合在一起Main类是两个Test类继承的东西。他们可以定义一个out方法,它可以完成开发人员想要的任何操作。这是一种插件风格的设计,以便人们可以在自己的类中定义自己的out方法,然后当我的主程序选择其中一个自定义类时,我可以说

some_test.run

如果他们决定实施将要执行的out方法。

有没有更好的方法来实现run方法,以便我不需要显式写self.class.method_defined??该对象可以是任何Test对象,我不希望他们必须覆盖run方法,以便在method_defined?调用前放置自己的类名。

class Main
  def run
    send(:out) if self.class.method_defined?(:out)
  end
end

class TestA < Main

  def out
    p "Test A here"
  end
end

class TestB < Main

  def out
    p "Test B here"
  end
end

a = TestA.new
a.run
# will execute a's out method

b = TestB.new
b.run
# will execute b's out method

1 个答案:

答案 0 :(得分:7)

我只是在父类中提供一个空的out方法,并允许子类覆盖它,只是普通的OO:

class Main
  def run
    out
  end

  def out
    #out will now always be defined
  end
end

您也可以使用defined?

class Main
  def run
    out if defined? out
  end
end

请注意defined的参数为out,而不是符号:out

或者,更通俗地说,您可以使用respond_to?

class Main
  def run
    out if respond_to? :out
  end
end