在派生类中访问基类的实例变量的更好方法是什么?

时间:2014-06-30 20:56:29

标签: ruby oop inheritance

在下面的情况下,有哪些更好的方法来访问派生类中的基类实例变量?

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

1 个答案:

答案 0 :(得分:3)

首先,上述方法不会起作用,因为它们希望使用与基类相同数量的参数进行初始化。其次,当您致电C.new.xyzD.new.xyz时,您正在创建新实例,因此他们无法自动访问var_avar_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而不是@@