【发布时间】:2014-01-13 03:35:25
【问题描述】:
我想通过继承基类来提供一致的接口。但是我想用额外的功能包装那个基类上的某些方法。
假设每个子类都有一个 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 然后被子类覆盖,包装丢失。
可以做什么?
【问题讨论】:
标签: ruby inheritance methods