【问题标题】:Ruby: create a not-inheritable class methodRuby:创建一个不可继承的类方法
【发布时间】:2013-06-18 12:22:54
【问题描述】:

假设我有一堂课:

class Person
  def self.say
    puts "hello"
  end
end

还有一个子类:

  class Woman < Person
  end

我希望“say”方法是公共方法,但我不希望它被“Woman”或任何其他子类继承。实现这一目标的正确方法是什么?

  • 我不想重写该方法,因为我不知道未来的子类。
  • 我知道我可以使用 remove_method 之类的东西,但我宁愿根本不继承该方法

【问题讨论】:

  • 你在那里做的有些奇怪的 OOP。
  • 你想达到什么目的?
  • 我想在基类中有一个静态方法,根据我提供的参数找到一个子类@Gerep

标签: ruby oop inheritance


【解决方案1】:

我想在基类中有一个静态方法,它根据我提供的参数找到一个子类

在其他地方定义该静态方法,例如在模块中:

module Person

  class Base
  end

  class Woman < Base
  end

  def self.create(name)
    case name
    when :woman
      Woman.new
    end
  end

end

Person.create(:woman)          # => #<Person::Woman:0x007fe5040619e0>
Person::Woman.create(:woman)   # => undefined method `create' for Person::Woman:Class

【讨论】:

    【解决方案2】:

    我同意这是一个奇怪的要求。但如果你坚持,你可以为Person 创建一个inherited 钩子,并手动从子类中删除类方法。

    class Person
      def self.say
        puts "Hello"
      end
    
      def self.inherited(subclass)
        self.methods(false).each do |m|
          subclass.instance_eval { eval("undef :#{m}") }
        end
      end
    end
    
    class Woman < Person
    end
    
    Person.say   #=> Hello
    Woman.say    #=> undefined method `say' for Woman:Class (NoMethodError)
    

    【讨论】:

    • 那是我不想做的事情。 (undef/remove_method)。我宁愿根本不继承它!
    • @benams 你应该去找其他语言:-)
    猜你喜欢
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    相关资源
    最近更新 更多