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
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)
class Person
def self.say
if self.superclass != Person
puts "Hello"
else
puts "Don't say 'hello', make up your own greeting"
end
end
end
class Woman < Person
end
puts Person.say
puts Woman.say
3条答案
按热度按时间a0zr77ik1#
我想在基类中有一个静态方法,它根据我提供的参数找到一个子类
在其他地方定义静态方法,例如在模块中:
yftpprvb2#
我同意这是一个奇怪的要求。但是如果您坚持的话,您可以为
Person
创建一个inherited
钩子,并手动从子类中删除类方法。ukdjmx9f3#
您可以检查类方法调用是来自父类还是来自继承类,然后为其执行适当的逻辑。
此解决方案满足您的两个要求。