Ruby静态继承

Ruby静态继承,ruby,inheritance,static,Ruby,Inheritance,Static,我试图在ruby中使用一个类变量。但是类变量在整个层次结构中都会发生变化,因此对于这个目标是无用的: 假设我有3个类,每个类都是继承的,除了父类 class A end class B < A end class C < B end 我还应该指定A.num仍然可以使用,而不必更改B.num或C.num,除非继承了它。自OP更改问题后编辑 为a和B使用类实例变量 class A singleton_class.class_eval{attr_accessor :num} en

我试图在ruby中使用一个类变量。但是类变量在整个层次结构中都会发生变化,因此对于这个目标是无用的:

假设我有3个类,每个类都是继承的,除了父类

class A
end

class B < A
end

class C < B
end

我还应该指定A.num仍然可以使用,而不必更改B.num或C.num,除非继承了它。

自OP更改问题后编辑

a
B
使用类实例变量

class A
  singleton_class.class_eval{attr_accessor :num}
end

class B < A
  singleton_class.class_eval{attr_accessor :num}
end

class C < B
  def self.num; superclass.num end
  def self.num= v; superclass.num = v end
end

B.num = 2
A.num # => nil
C.num # => 2
A类
singleton_class.class_eval{attr_访问器:num}
结束
B类零
C.num#=>2

为什么类变量“无用”?你的句子不符合逻辑。@sawa我不相信我的句子不流畅。类B上的类变量也将更改类A上的类变量。它将改变父母和孩子。请回顾这个答案:你似乎没有正确理解我的评论。我要提到的是,类变量在层次结构中是共享的这一事实并没有导致您得出类变量是无用的结论。我想知道你声称类变量没有用处的依据。答案是@变量不是类变量…显然类变量没有用处。它们没有达到我期望的目标。为了补充Sawa的答案:如果你后来决定B不应该覆盖num,那么你必须将
self.num
的定义从C复制到B。每个拥有
num
或其超类委托的类都必须有几行
num
的代码。
class A
  singleton_class.class_eval{attr_accessor :num}
end

class B < A
  singleton_class.class_eval{attr_accessor :num}
end

class C < B
  def self.num; superclass.num end
  def self.num= v; superclass.num = v end
end

B.num = 2
A.num # => nil
C.num # => 2