3

我有一个来自第三方 gem 的超类中的方法,我想隐藏它。如果根本不可能调用此方法,我更愿意,所以不要只是覆盖它并将主体留空。

4

3 回答 3

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'
于 2013-10-22T16:14:43.577 回答
3

我相信这可能是您正在寻找的:

undef_method :foo

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

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

remove_method :foo

这将从子项中删除该方法,但仍将沿继承链向上传递。

文档:undef_methodremove_method

于 2013-10-22T16:08:01.577 回答
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)
于 2013-10-22T16:06:53.973 回答