Search code examples
rubyruby-on-rails-3inheritancemultiple-inheritancesingle-table-inheritance

Ruby Class Inheritance: How to preven a public method from beeing overwritten in the child classes


Is it possible to prevent a public method from being overwritten in the child classes?

class Parent
  def some_method
     #important stuff that should never be overwritten
  end
end

class Child < Parent
  def some_method
     #should not be possible to overwrite (raise an error if a child class tries to do it)
  end
end

Thanks!


Solution

  • You can use 'method_added' and 'inherited' hook for this purpose:

    class Foo
      def self.inherited(sub)
        sub.class_eval do
          def self.method_added(name)
            if name == :some_method
              remove_method name
              raise Exception, "Can't override #{name} method"
            end
          end
        end
      end
    end
    
    class Bar < Foo
    end
    
    class Bar
      def some_method
      end
    end
    # => Exception: Can't override some_method method