2

我有一个班级 Foo,我创建了一个子案例 Bar。如果 @foo_count 已经在父类中初始化,为什么我必须在子类中初始化它?

请指教?

class Foo
  @foo_count = 0  
end

class Bar < Foo
  @foo_count = 100
end
4

2 回答 2

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]

现在对象FooBar实例变量都具有相同的名称@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
于 2013-09-02T19:03:58.123 回答
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

但是,许多人认为使用类变量是不好的做法。它们的行为不像其他语言中的类变量,因此会产生意想不到的后果,因此人们通常坚持使用类实例变量

于 2013-09-02T19:05:30.957 回答