我想通过从基类继承来提供一致的接口(interface)。但是我想用附加功能包装该基类的某些方法。
假设每个子类都有一个 eat 方法:
class ClassyAnimal
def self.inherited(base)
base.class_eval do
alias :eat_without_napkin :eat
alias :eat :eat_with_napkin
end
end
def eat_with_napkin
begin
eat_without_napkin
rescue FoodOutOfMouthError
puts 'phew!'
end
end
def eat
raise 'Please implement the #eat method.'
end
end
class ClassyWalrus < ClassyAnimal
def eat
puts 'Eating Cronuts.'
raise FoodOutOfMouthError.new('Damn these tusks!')
puts 'Finishing my meal.'
end
end
class FoodOutOfMouthError < StandardError; end
现在我希望 ClassyWalrus.new.eat
会输出以下内容:
Eating Cronuts.
phew!
不幸的是,我们得到以下信息:
Eating Cronuts.
FoodOutOfMouthError: Damn these tusks!
在继承时,因此在 alias
时,#eat 被定义为 ClassyAnimal 内部的那个,而不是 ClassyWalrus 内部的那个。别名 #eat 然后被子类覆盖,并且包装丢失。
可以做什么?
最佳答案
尝试在代码中添加以下内容。
在类 ClassyAnimal
中:
def eat_with_napkin
begin
yield
rescue FoodOutOfMouthError
puts 'phew!'
end
end
在类 ClassyWalrus
中:
def eat
puts 'Eating Cronuts.'
superclass.eat do
raise FoodOutOfMouthError.new('Damn these tusks!')
end
puts 'Finishing my meal.'
end
关于ruby - 用别名包装继承的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768572/