使用子类中的常量在父类中定义attr_accessor

时间:2019-07-04 14:45:20

标签: ruby

我有父母班,还有一些孩子班

class Base
end
class ChildNameAge < Base
  ATTRIBUTES = [:name, :age]
  attr_accessor *ATTRIBUTES
end
class ChildHeightWidth < Base
  ATTRIBUTES = [:height, :width]
  attr_accessor *ATTRIBUTES
end

如何将这个attr_accessor移到父类,但仍从子类使用ATTRIBUTES常量,因此我不必为每个子类重复此attr_accessor *ATTRIBUTES

2 个答案:

答案 0 :(得分:3)

您的问题从根本上是有缺陷的。您正在颠倒基于类的继承的依赖周期。

父母 根据类的继承对其一无所知。

Base移动到const wchar_t* driverName = L"\\\\?\\globalroot\\Device\\MyDriver HANDLE driver = CreateFile(driverName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); (父类)将意味着它只能访问本身定义的值 ,而不能访问其任何子级!

答案 1 :(得分:0)

您将在Base中将ATTRIBUTES定义为将类名称与属性相关联的哈希,并为Class使用继承的方法。

class Base
  ATTRIBUTES = {
    "ChildNameAge" => [:name, :age],
    "ChildHeightWidth" => [:height, :width]
  }

  def self.inherited(child)
    return unless (attributes = ATTRIBUTES[child.name])
    child.class_eval { attr_accessor *attributes }
  end
end

这样,当您创建子类时,将直接对其进行定义。但是,就像其他人所说的那样,这不是一个好主意(即使有可能)。您无法记录属性(使用YARD这样的自动文档),并且在阅读Child实现时,您看不到定义属性的确切位置(这可能会导致类的误解。)