在下面的情况下,有哪些更好的方法来访问派生类中的基类实例变量?
class A
attr_accessor :var_a, :var_b
def initialize(var_a, var_b)
@var_a = var_a
@var_b = var_b
end
def xyz
C.new.xyz
D.new.xyz
end
end
class C < A
def xyz
puts "C xyz #{var_a} #{var_b}"
end
end
class D < A
def xyz
puts "D xyz #{var_a} #{var_b}"
end
end
a = A.new
a.xyz
答案 0 :(得分:3)
首先,上述方法不会起作用,因为它们希望使用与基类相同数量的参数进行初始化。其次,当您致电C.new.xyz
或D.new.xyz
时,您正在创建新实例,因此他们无法自动访问var_a
或var_b
您的实例由A.new
返回。
为了实现这一目标,您必须使用a = A.new('foo', 'bar')
进行实例化,然后在A#xyz
内部,您将需要实例化{{1} }和var_a
。
var_b
如果您要在所有实例中共享def xyz
C.new(var_a, var_b).xyz
D.new(var_a, var_b).xyz
end
和var_a
,那么您需要查找类变量而不是实例变量。这些前缀为var_b
而不是@@
。