如何从超类中隐藏方法?

时间:2013-10-22 16:02:26

标签: ruby

我在第三方gem的超类中有一个方法,我想隐藏它。我宁愿如果根本不可能调用这个方法,那么不要只是覆盖它并将身体留空。

3 个答案:

答案 0 :(得分:3)

我相信这可能是你正在寻找的东西:

undef_method :foo

这将阻止对方法foo的任何调用。

相反,这不会达到同样的效果:

remove_method :foo

这将从子进程中删除该方法,但仍会传递继承链。

文档:undef_methodremove_method

答案 1 :(得分:3)

使用undef关键字。

class A
  def foo
    5
  end
end

class B < A
  undef foo
end

A.new.foo #=> 5
B.new.foo #=> NameError: undefined local variable or method `foo'

答案 2 :(得分:2)

你试图在那里做OOP是错误的。我建议你使用组合而不是继承。

require 'forwardable' 

class SomeBaseClass
  def foo
    puts 'foo'
  end

  def bar
    puts 'bar'
  end

  def quux
    puts 'quux'
  end
end

class MyClass

  def initialize
    @base = SomeBaseClass.new
  end

  extend Forwardable

  def_delegators :@base, :foo, :bar # but not quux
end

mc = MyClass.new

mc.foo
mc.bar
mc.quux

# >> foo
# >> bar
# ~> -:32:in `<main>': undefined method `quux' for #<MyClass:0x007febcc155210> (NoMethodError)