【问题标题】:Making an instance method inaccessible from a subclass使子类无法访问实例方法
【发布时间】:2016-05-20 16:07:43
【问题描述】:

给定:

class Base
  def foo
    puts 'foo!!!'
  end
end

class Ball < Base
end

我想要:

  1. Ball.new.foo 返回错误:No Method Found
  2. Base.new.foo 返回:foo!!!

我的尝试是:

  • 我可以做protected def foo,这样 1. 工作。但是,这不适用于 2。
  • 我可以像上面给出的那样做,这样 2. 就可以了。但是 1. 不起作用。

任何想法如何使 1. 和 2. 工作?

问题的背景

我有一个 ApplicationController 操作 def routing_error 来处理所有剩余的未定义路由。问题在于继承ApplicationController 的所有其他控制器也继承了该操作,我希望它不是。我可以只使用def routing_error 操作创建一个单独的控制器,但我觉得这有点矫枉过正,我只是想知道是否有其他方法可以解决这个问题。

【问题讨论】:

    标签: ruby oop inheritance visibility


    【解决方案1】:

    做:

    class Ball < Base
      undef_method :foo
    end
    

    如果您想取消定义许多类的方法,并且不想为每个类编写上述代码,则在两者之间创建一个类。

    class Dummy < Base
      undef_method :foo
    end
    
    class Base < Dummy
    end
    
    class Base2 < Dummy
    end
    
    ...
    

    【讨论】:

    • 这解决了我的问题。但是,至于我的问题的根源,这需要我把undef_method :foo 放到我所有的控制器上。也许,我现在可以这样做。谢谢!
    • ObjectSpace.each_object(Class).select { |klass| klass &lt; ApplicationController }.each { |c| c.send :undef_method, :foo }
    • @mudasobwa,谢谢!这也会有帮助:) 我只需要确保在所有应用程序代码的末尾调用这一行。
    • @Jay-ArPolidario 你不需要这样做。查看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多