我有父母班,还有一些孩子班
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
。
答案 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实现时,您看不到定义属性的确切位置(这可能会导致类的误解。)