2010-12-13 5 views
2
class Test 
    def initialize 
    @var = "125" 
    end 
    def testmethod 
    puts @var 
    puts "accessing me from child class" 
    end 
end 

class TestExtension < Test 

    def method1 
    puts @var = "One Hundred and twenty five" 
    testmethod() 
    end 
end 

t = Test.new 
p = TestExtension.new 
p.method1 
t.testmethod 

выход:переменной экземпляра в рубин

One Hundred and twenty five 
One Hundred and twenty five 
accessing me from child class 
125 
accessing me from child class 

Мой вопрос заключается в том, что доступ к testmethod() в дочернем классе TestExtension результатов в получении доступа, что значение @var, который в настоящее время объявлен в TestExtension классе вместо доступа к значению, которое объявляется в классе Test. Правильно ли это?

+1

отформатированного код (поставив 4 пробела перед всеми строками коды и обратных кавычками вокруг всех идентификаторов в вашем английском тексте). Прочтите это для получения дополнительной информации: http://stackoverflow.com/editing-help – Jakob

ответ

3

Короткий ответ:
Да

Слегка развернутый ответ:
Instance переменные, так как их названия, на например. Для каждого объекта может быть только одна переменная, называемая @var, независимо от того, какой класс имеет код для доступа к ней.

+0

Тишина полезная. Благодаря :) –

0

Это является правильным.

Как сказал Гарет, переменные экземпляра относятся к экземплярам, ​​а не к классам.

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

Одним словом, все в Ruby является объектом, включая классы. В следующем примере Base и Derivative являются просто константами, которые содержат ссылку на объекты. Эти объекты представляют классы (ta-da!).

Принимая во внимание этот факт, мы можем сделать следующее:

class Base 
    @var = 1 

    def self.change(new_value) 
    @var = new_value 
    end 

    def self.to_s 
    "#{self.name}, @var = #{@var}" 
    end 
end 

class Derivative < Base; end 

Derivative.change(2) 

puts Base   # => Base, @var = 1 
puts Derivative # => Derivative, @var = 2 
Смежные вопросы