非表示にしたいサードパーティの宝石のスーパークラスにメソッドがあります。このメソッドを呼び出すことがまったく不可能な場合は、それをオーバーライドして本体を空のままにするだけではいけません。
質問する
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
これにより、子からメソッドが削除されますが、継承チェーンは引き続き通過します。
ドキュメント: undef_methodとremove_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 に答える