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

标签 ruby inheritance methods

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

相关文章:

ruby - 从 war 文件中运行 rake 任务

c++ - 调用基类构造函数的规则是什么?

java - 在java中初始化final字段的奇怪行为

java - 如何重构单例的类层次结构,其中每个类都有一个 getInstance() 方法?

c# - this[参数] 语法的用途是什么?

ruby - 计算哈希中最高的最大值 3 个值

ruby - Ubuntu 12.04 下的 RVM 和 Ruby 2.0.0

java - 等效静态和非静态方法的速度差异很大

ruby-on-rails - Ruby:无法使用两个参数进行数学运算

ruby - 打印顶部没有 XML 标题行的 XML 文档