我正在尝试从孩子访问父类的数据成员
班级。我不知道怎么称呼它。我找到了很多关于
从子级访问类变量而不是实例变量
班级。这是我的代码:
class Shape
@var = "woohoo"
该变量称为类实例变量,人们使用类实例变量而不是类变量(即@@variable)的原因恰恰是这样子类就无法访问它。因为 类实例变量 是类变量在其他语言中的工作方式,@@variables 在 ruby 中使用不多,因为如果您来自其他具有类变量的语言,它们的行为会令人惊讶。
您的用例显然要求在子类中可以访问一个类变量,因此请使用@@variable。
编辑:我希望子类的单个实例替换
'woohoo' 字符串具有自己独特的字符串。
您可以为此使用类实例变量:
class Shape
@var = "shapehoo"
class <<self
attr_accessor :var
end
def display_class_instance_var
puts Shape.var
end
end
class Rectangle < Shape
@var = "recthoo"
def display_class_instance_var
puts Rectangle.var
end
end
class Circle < Shape
@var = "circlehoo"
def display_class_instance_var
puts Circle.var
end
end
Shape.new.display_class_instance_var
Rectangle.new.display_class_instance_var
Circle.new.display_class_instance_var
Rectangle.new.display_class_instance_var
Shape.new.display_class_instance_var
--output:--
shapehoo
recthoo
circlehoo
recthoo
shapehoo
与常规实例变量一样,类实例变量是私有的,因此如果要访问它们,则必须提供访问器方法。访问器需要在类的单例类中,您可以使用以下语法打开它:
class <<self
end
添加:
关于这段代码:
class Rectangle < Shape
@length
@width
def initialize ( l,w )
@length = l
@width = w
end
在您的initialize() 方法中,您没有设置您在initialize 方法上方声明的@length、@width 变量。在 ruby 中,@variables 在创建@variables 时将自己附加到self 的任何对象。更详细的代码如下所示:
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 类,这意味着它们是完全不同的变量。