【发布时间】:2014-03-15 09:30:29
【问题描述】:
如以下代码所示,在超类中定义类访问器可能会产生意外行为,因为类访问器对于所有子类来说都是同一个变量。
class Super
cattr_accessor :name
end
class SubA < Super; end
class SubB < Super; end
SubA.name = "A"
SubB.name = "B"
SubA.name
=> "B" # unexpected!
我希望每个子类都有一个独立的类访问器,因此一个可能的解决方案是将 cattr_accessor 从超类中移出并将其放入每个子类中。
class Super; end
class SubA < Super
cattr_accessor :name
end
class SubB < Super
cattr_accessor :name
end
SubA.name = "A"
SubB.name = "B"
SubA.name
=> "A" # expected!
这个解决方案是一个好习惯吗?你知道更好的选择吗?
【问题讨论】:
-
这是预期行为。一个是
Super的属性,由它的子代继承。另一个是子类的一个属性,它覆盖了继承的值。 --- 一个问题,寿:这个值会改变吗?类变量往往是错误的解决方案,考虑它应该是一个常量,还是一个实例变量。
标签: ruby-on-rails ruby inheritance class-variables