我有一个来自第三方 gem 的超类中的方法,我想隐藏它。如果根本不可能调用此方法,我更愿意,所以不要只是覆盖它并将主体留空。
问问题
71 次
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
这将从子项中删除该方法,但仍将沿继承链向上传递。
于 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 回答