2012-09-05 6 views
0

내가 상속 이해하려고 노력 해요 : 내가 4를 기다리고있을 때 나는 moe.wheel을 수행 할 때루비와 상속

moe = Car.new 
larry = StretchLimo.new 

, 나는 6 얻을 :

class Car 
    @@wheels = 4 
    def wheel 
    @@wheels 
    end 
end 

class StretchLimo < Car 
    @@wheels = 6 
    def whee 
    @@wheels 
    end 
    def turn_on_television 
    end 
end 

나는 일부 개체과 같이 인스턴스화를 .

내가 따르는 Ruby 튜토리얼은 4으로되어 있다고 말합니다. Larry.whee은 분명히 6을 반환해야합니다.

덧붙여서, "wheel"와 "whee"기능이 추가되어 값을 볼 수있었습니다. 아무도 여기서 무엇이 잘못 됐는지 설명 할 수 있습니까?

+0

에 오신 것을 환영합니다. 코드를 올바르게 포맷하십시오. –

+0

루비의 클래스 변수가 이상하고 혼란 스럽습니다. 아마도 그것들을 사용하지 않는 것이 가장 쉽습니다. – levinalex

답변

0

@@은 클래스 변수이므로 지정된 클래스와 모든 파생 클래스에서 인스턴스화 된 모든 개체에서 공유됩니다. 루비 해석되기 때문에 당신이 StretchLimo 개체를 인스턴스화 할 때까지, 그것은 StretchLimo 코드의 보지한다, 그래서 당신이 한 경우 다음

moe = Car.new 
moe.wheel # should give 4 
larry = StretchLimo.new 
moe.wheel # should give 6 

StretchLimo 해석됩니다 경우는 @@wheels 클래스 변수를 업데이트하기 때문에 6이되어야합니다. 반면, "@"() 중 하나만 사용하여 "바퀴"를 선언하면 해당 개체 자체에 특정한 인스턴스 변수가되므로 원하는 동작을 얻을 수 있습니다.

+0

팁 주셔서 감사합니다! –

+0

이것은 사실이 아닙니다. 'moe.wheel'은 두 번째 줄에 6을줍니다. 시도 해봐. – levinalex

+0

은 디렉토리 구조와 해석 방법에 따라 다릅니다. 두 클래스가 같은 파일에 정의되어 있고 거기에서로드되는 경우 moe.wheel -> 6을 얻지 만, 인터프리터가 이러한 클래스를 순차적으로로드하도록 할 경우에는 그렇지 않습니다. 그럼에도 불구하고 선호하는 방법은 인스턴스 변수 –

1

루비의 클래스 변수는 strangeconfusing입니다.

당신이 원하는 것을 구현하는 관용적 방법은 이것이다 :

class Car 
    def wheels 
    4 
    end 
end 

class StretchLimo < Car 
    def wheels 
    6 
    end 
end 

Car.new.wheels #=> 4 
StretchLimo.new.wheels #=> 6 

일이 뭐죠은 클래스 변수가 이 클래스의 모든 인스턴스 사이을 공유합니다. StrechLimoCar의 서브 클래스이므로 StrechLimo의 인스턴스도이 변수를 참조하십시오.

+0

을 사용하는 것입니다. 이것은 거의 확실하게 선호되는 방법이 아닙니다. http://stackoverflow.com/questions/2441524/closest-ruby-representation-of-a-private-static-final을 참조하십시오. - 및 - public-static-final –