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