2013-10-22 37 views
3

我在我想隐藏的第三方gem的超类中有一个方法。我宁愿如果根本不可能调用这个方法,那么不仅仅是覆盖它并且让它空着。如何隐藏超类的方法?

回答

3

我认为这可能是你在找什么:

undef_method :foo 

这将防止方法foo任何来电。

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

remove_method :foo 

将从孩子的方法去掉,但仍然会通过了继承链。

文档:undef_methodremove_method

+0

其实在这种情况下很难选择“正确答案”。我喜欢这种方式,因为它更简洁,我不必为所有我想使用的功能编写一个委托(这是很多),但我认为在某些情况下最好使用Sergio Tulentsev的答案 – Nessuno

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) 
+0

这是一个非常有趣的设计模式。以前没见过。你碰巧知道为什么存在一个'undef'关键字,当这是这样做的更好的方法吗? – Nessuno

+1

@Nessuno:因为Ruby非常灵活。而“更好”是主观的。 :) –

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'