我有一个子类,我想为一组方法实现一些默认行为,例如,如果我知道我需要覆盖该方法,但是如果该方法尚不支持则只想打印警告在这个特定的子类上。
我可以覆盖子类中的每个方法,就像这样,但我想知道是否有更简单的方法,可能使用delegate或method_missing?
class Foo
def method_a
# do foo stuff
end
def method_b
# do foo stuff
end
def method_c
# do foo stuff
end
end
class Bar < Foo
def not_yet_supported
puts "warnnig not yet supported"
end
def method_b
not_yet_supported
end
end
答案 0 :(得分:1)
根据评论中的建议使用alias
or alias_method
是一条简单的路线,看起来像
alias method_b not_yet_supported
alias_method :method_c, :not_yet_supported
请注意语法上的差异,因为alias
是一个关键字,而alias_method
是一种方法。
如果你想声明一个不受支持的方法的完整列表,可以使用一点元编程来实现:
class Foo
def self.not_yet_supported(*method_names)
method_names.each do |method_name|
define_method method_name do
puts "#{method_name} is not yet supported on #{self.class.name}"
end
end
end
not_yet_supported :bar, :baz
end
答案 1 :(得分:1)
更清洁的方法可能是使用method_missing
:
class Foo
UNIMPLEMENTED_METHODS = [:method_a, :method_b, :method_etc]
def method_missing(method_id)
UNIMPLEMENTED_METHODS.include? method_id ? warn("#{method_id} has not been implemented") : raise(NoMethodError)
end
end