从子类访问实例变量

我正在尝试从子类访问父类的数据库。 我不知道怎么称呼它。 我发现了很多关于访问类变量的信息,但没有找到子类中的实例变量。 这是我的代码:

class Shape @var = "woohoo" def initialize () end def area () end end class Rectangle < Shape @length @width def initialize ( l,w ) @length = l @width = w end def area () print @var return @length * @width end end 

我试图打印@var时出错。 我尝试了父。@ var,Shape。@ var,以及其他一些我希望从其他语言中获得的组合。 在子类的实例中打印(如果可能的话)变量的正确方法是什么?

编辑:我希望子类的各个实例用他们自己的唯一字符串替换’woohoo’字符串。

谢谢!

您可以使用“super”调用父类初始化块并定义实例变量“@var”。 在这种情况下,您可以为另一个实例修改此实例变量的值。 像这样:

 class Shape def initialize () @var = "woohoo" end end class Rectangle < Shape def initialize(l, w) @length = l @width = w super() end def area() print @var return @length * @width end def var=(new_value) @var = new_value end end a = Rectangle.new(1,1) a.area # => woohoo1 a.var = "kaboom" a.area # => kaboom1 b = Rectangle.new(2,2) b.area # => woohoo4 

或者你可以使用attr_accessor

 class Shape def initialize @var = "woohoo" end end class Rectangle < Shape attr_accessor :var def initialize(l, w) @length, @width = l, w super() end def area() print @var return @length * @width end end a = Rectangle.new(1,1) a.area # => woohoo1 a.var = "kaboom" a.area # => kaboom1 b = Rectangle.new(2,2) b.area # => woohoo4 

我正在尝试从子类访问父类的数据库。 我不知道怎么称呼它。 我发现了很多关于访问类变量的信息,但没有找到子类中的实例变量。 这是我的代码:

 class Shape @var = "woohoo" 

该变量称为类实例变量 ,人们使用类实例变量而不是类变量 (即@@variable )的原因正是因为子类无法访问它。 因为类实例变量是类变量在其他语言中工作的方式,所以@@variables在ruby中的用处不多,因为如果你来自另一种具有类变量的语言,它们的行为会令人惊讶。

您的用例显然要求在子类中访问类变量,因此请使用@@variable

编辑:我希望子类的各个实例用他们自己的唯一字符串替换’woohoo’字符串。

您可以使用类实例变量

 class Shape @var = "shapehoo" class < 

与常规实例变量一样, 类实例变量是私有的,因此如果要访问它们,则必须提供访问器方法。 访问器需要在类的单例类中,您可以使用以下语法打开它:

 class < 

添加:

关于此代码:

 class Rectangle < Shape @length @width def initialize ( l,w ) @length = l @width = w end 

在initialize()方法中,您没有设置在initialize方法之上声明的@length,@ width变量。 在ruby中,@ variables将自己附加到@variables创建时的自身对象。 以下是您的代码的更多详细信息:

 class Rectangle < Shape #self=Rectangle class @length @width def initialize ( l,w ) #self=a new instance of the Rectangle class created by initialize @length = l @width = w end 

因此,在initialize()中创建的@variables将自己附加到新实例,而在initialize()上面声明的@variables将自己附加到Rectangle类,这意味着它们是完全不同的变量。