3

非表示にしたいサードパーティの宝石のスーパークラスにメソッドがあります。このメソッドを呼び出すことがまったく不可能な場合は、それをオーバーライドして本体を空のままにするだけではいけません。

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 に答える