我有一个Foo课,我创建了一个儿童案例吧。 如果已经在父类中初始化了@coo_count,为什么必须在子类中初始化它?
请指教?
class Foo
@foo_count = 0
end
class Bar < Foo
@foo_count = 100
end
答案 0 :(得分:2)
为什么这样?好的,让我这样告诉你:
class Foo
@foo_count = 0
end
class Bar < Foo;end
Bar.instance_variables # => []
Foo.instance_variables # => [:@foo_count]
类@foo_count
的 Foo
类实例变量 。无论何时从像Bar
这样的超类创建类似Foo
的子类,都不要认为类实例变量将继承到类Bar
。现在看 -
class Foo
@foo_count = 0
end
class Bar < Foo
@foo_count = 10
end
Bar.instance_variables # => [:@foo_count]
Foo.instance_variables # => [:@foo_count]
现在,对象Foo
和Bar
都有它们的实例变量,只有同名@foo_count
,这并不意味着它们共享同一个实例变量。每个对象都有总是它自己的实例变量副本。
这里有一些例子可以让你清楚地了解事情: -
class Foo
@foo_count = 0
def self.meth_foo
@foo_count
end
end
class Bar < Foo
#@foo_count = 10
end
Foo.meth_foo # => 0
Bar.meth_foo # => nil
但是现在 -
class Foo
@foo_count = 0
def self.meth_foo
@foo_count
end
end
class Bar < Foo
@foo_count = 10
end
Foo.meth_foo # => 0
Bar.meth_foo # => 10
答案 1 :(得分:1)
实例变量将自身附加到创建时自身的任何对象。 Foo中的实例变量@foo_count附加到Foo类对象,因此它被称为类实例变量。类似地,Bar中的实例变量@foo_count将自身附加到Bar类对象。因此,有两个类实例变量 - 而不是一个。对象不共享实例变量 - 每个对象都有自己的实例变量。
class Foo
puts self
@foo_count = 0
end
class Bar < Foo
puts self
@foo_count = 100
end
--output:--
Foo
Bar
顺便说一下,如果你想要继承变量,你可以使用类变量:
class Foo
@@foo_count = 'hello'
end
class Bar < Foo
def greet
puts @@foo_count
end
end
Bar.new.greet
--output:--
hello
然而,许多人认为使用类变量是不好的做法。它们不像其他语言中的类变量那样,因此它们会产生意想不到的后果,因此通常人们会坚持类实例变量。