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