1

我有以下一段代码。它实际上是三个独立的脚本,除了我将它们组合在一起。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
4

1 回答 1

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

注意definedis的参数out,而不是符号:out

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

class Main
  def run
    out if respond_to? :out
  end
end
于 2012-10-08T02:46:00.923 回答