假设我有一个班级:
class Person
def self.say
puts "hello"
end
end
一个子类:
class Woman < Person
end
我希望“说”方法是公共方法,但我不希望它被“女人”或任何其他子类继承。什么是实现这一目标的正确方法?
remove_method
的内容,但我宁愿不继承该方法答案 0 :(得分:3)
我希望在基类中有一个静态方法,它根据我提供的参数找到一个子类
在其他地方定义静态方法,例如在模块中:
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
答案 1 :(得分:1)
我同意这是一个奇怪的要求。但是如果你坚持,你可以为inherited
创建一个Person
钩子,并从子类中手动删除类方法。
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)