Ruby 使用子类中的常量在父类中定义attr_访问器
我有父类和一些子类Ruby 使用子类中的常量在父类中定义attr_访问器,ruby,Ruby,我有父类和一些子类 class Base end class-ChildNameAge[:高度,:宽度] } def self.inherited(子项) 返回,除非(attributes=attributes[child.name]) child.class_eval{attr_accessor*attributes} 结束 结束 这样,当您创建子类时,它将被直接定义。但正如其他人所说,这不是一个好主意(即使可能)。你不能记录你的属性(使用自动doc-like-YARD),当你阅读子实现时
class Base
end
class-ChildNameAge
class-ChildHeightWidth
如何将此属性访问器移动到父类,但仍然使用子类中的
属性
常量,这样我就不必为每个子类重复此属性访问器*属性。您的问题从根本上讲是有缺陷的。您正在反转基于类的继承的依赖循环
根据基于类的继承的定义,父母不能了解他们孩子的任何情况
将attr\u accessor
移动到Base
(父)类将意味着它只能访问自己定义的值,而不能访问其任何子类 您将在Base中将属性定义为将类名与属性关联的散列,并使用继承的类方法
类基
属性={
“ChildNameAge”=>[:name,:age],
“ChildHeightWidth”=>[:高度,:宽度]
}
def self.inherited(子项)
返回,除非(attributes=attributes[child.name])
child.class_eval{attr_accessor*attributes}
结束
结束
这样,当您创建子类时,它将被直接定义。但正如其他人所说,这不是一个好主意(即使可能)。你不能记录你的属性(使用自动doc-like-YARD),当你阅读子实现时,你看不到属性定义的确切位置(这可能导致对类的错误理解)。我不认为这是可能的,我也不认为这样做是一个好主意我不认为这个问题有缺陷。这有点类似于在父级中定义一个模板方法,该方法调用另一个应该在子级中定义的方法。这里的问题是attr\u accessor
是在加载类时调用的,而不是在使用类时调用的。
class ChildNameAge < Base
ATTRIBUTES = [:name, :age]
attr_accessor *ATTRIBUTES
end
class ChildHeightWidth < Base
ATTRIBUTES = [:height, :width]
attr_accessor *ATTRIBUTES
end