gpt4 book ai didi

ruby - 用别名包装继承的方法

转载 作者:太空宇宙 更新时间:2023-11-03 16:28:12 24 4
gpt4 key购买 nike

我想通过从基类继承来提供一致的接口(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com