未实现方法的默认行为?

时间:2015-09-24 13:54:20

标签: ruby oop

我有一个子类,我想为一组方法实现一些默认行为,例如,如果我知道我需要覆盖该方法,但是如果该方法尚不支持则只想打印警告在这个特定的子类上。

我可以覆盖子类中的每个方法,就像这样,但我想知道是否有更简单的方法,可能使用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

2 个答案:

答案 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