【发布时间】:2015-04-04 15:46:11
【问题描述】:
在 Ruby 中,是否可以在不影响子类中的代码的情况下从超类方法中让出子类方法?我试图避免在子类中调用super。
class SuperClass
def do_something
puts "getting ready..."
# how to then yield back to the subclass do_something method?
puts "done."
end
end
class SubClass < SuperClass
def do_something
# how to first execute the superclass do_something method?
puts "doing something ..."
end
end
所需的功能是专门调用SubClass.do_something 并接收以下输出:
“准备好了……”
“做某事……”
“完成。”
编辑:
也许真正的问题是:如何干燥下面的代码,从所有子类中删除对 self.get_ready 和 self.finish_up 的调用,使用任何使这些类保持干燥的 ruby 元编程技术:
class SuperClass
def self.get_ready
puts "getting ready ..."
end
def self.finish_up
puts "done."
end
end
class SubClassA < SuperClass
def self.do_something
self.get_ready
puts "doing something ..."
self.finish_up
end
end
class SubClassB < SuperClass
def self.do_something
self.get_ready
puts "doing something else, a little differently..."
self.finish_up
end
end
class SubClassC < SuperClass
def self.do_something
self.get_ready
puts "doing something crazy..."
self.finish_up
end
end
【问题讨论】:
-
既然你有单例方法,继承是无关紧要的。
-
您正在尝试的是设计缺陷。
SubClass#do_something致电SubClass#do_something。您可以在其中调用SuperClass#do_something,但不能反过来。
标签: ruby inheritance metaprogramming