2013-09-02 3 views
2

У меня есть класс Foo, я создаю детский корпус. Почему я должен инициализировать @foo_count в дочернем классе, если он уже инициализирован в родительском классе?В Ruby, зачем вам нужно инициализировать переменные дочернего класса?

Просьба сообщить?

class Foo 
    @foo_count = 0 
end 

class Bar < Foo 
    @foo_count = 100 
end 

ответ

1

переменных экземпляра прикрепляются к любому объекту, сам в то время они были созданы. Переменная экземпляра @foo_count в Foo присоединяется к объекту класса Foo, и поэтому она называется переменной экземпляра класса . Аналогично, переменная экземпляра @foo_count в Bar присоединяется к объекту класса 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 

Однако многие люди считают, используя переменные класса, чтобы быть плохой практикой. Они не действуют как переменные класса на других языках, и поэтому они приводят к неожиданным последствиям, поэтому обычно люди придерживаются переменных экземпляра класса.

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 только, что не означает, что они разделяют один и тот же экземпляр variable.Each объект всегда имеет свою собственную копию переменные экземпляра.

Вот еще некоторые примеры, чтобы получить вещи ясно вам: -

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 
Смежные вопросы