我想在类上定义一个方法,除了它已经定义了相同方法名的某个子类。
例如,我想在name
上定义一个方法Object
,让它可以从Object
及其子类访问,但Module
及其子类除外。 name
已经存在。这样做的最佳方式是什么?
我的尝试是这样的:
class Object
class ::Module; alias orig_name name end
def name
...
end
class ::Module; alias name orig_name end
end
是否有更好的方法可以使用prepend
?
答案 0 :(得分:1)
只需在Object上定义您的方法即可。由于Module的祖先是Object,它首先会看到Module然后是Object。
class Object
def name
puts self.class
end
end
class Module < Object
def name
puts "name #{self.class}"
end
end
Object.new.name
# => Object
Module.new.name
# => name Module
如果您创建继承自Object和Module的新类:
class ObjectInheritance < Object
end
class ModuleInheritance < Module
end
ObjectInheritance.new.name
# => ObjectInheritance
ModuleInheritance.new.name
# => name ModuleInheritance
Ruby首先会在self中查找方法,然后是包含模块,然后是祖先类。
答案 1 :(得分:0)
这不是def
已经有效吗?
class Object
def name
"This is my name"
end
end
Module.name # => "Module"
Class.name # => "Class"
String.name # => "String"
Object.new.name # => "This is my name"