2012-06-30 4 views
2

tl : dr 어떻게 감 결합합니까? 약간의 예가 필요할 수 있습니다.학부모의 내부 상태로 파고하기

저는 Programming Ruby - The Pragmatic Programmer 's Guide를 읽고 있습니다. 은 (http://ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html)

노래의 서브 클래스 KaraokeSong에 대한 그리고 to_s을 구현하는 방법에 대한 예제가있다.

class KaraokeSong < Song 
# ... 
def to_s 
"KS: #{@name}--#{@artist} (#{@duration}) [#{@lyrics}]" 
end 
end 
aSong = KaraokeSong.new("My Way", "Sinatra", 225, "And now, the...") 
aSong.to_s » "KS: My Way--Sinatra (225) [And now, the...]" 

지금 그들은 그것의 나쁜 방법은 그것을 할 말 :

우리가 밀리 초 단위로 시간을 저장하는 노래를 변경하기로 결정 말한다. 갑자기, KaraokeSong은 어리석은 가치를보고하기 시작할 것입니다. 3750 분 동안 지속되는 "My Way"의 가라오케 버전의 아이디어는 너무 무서워서 생각할 수 없습니다.

대신 슈퍼과 그리고 to_s를 정의해야합니다 :

def to_s 
super + " [#{@lyrics}]" 
end 

을 @duration 변수가 여전히 밀리 초에서 노래 시간을 저장하는 자 할 때, 단지 호출하는 새로운 그리고 to_s는 부모의 메소드를 어떻게 해결 않습니다 문제? 여전히 3750 분을 돌려줍니다. 그렇죠?

난 내가 뭔가를 Song@duration의 적절한 출력을 돌볼 것이라고 가정한다 그 2.

답변

3

의 차이를 이해 정말 해달라고 생각합니다.

Song에 기간을 밀리 초 단위로 저장하기로 결정하면 Song#to_s 메서드를 변경하기 만하면 모든 자손 중 to_s 개를 변경할 필요가 없습니다.