Ruby 在家长';内部状态

Ruby 在家长';内部状态,ruby,decoupling,Ruby,Decoupling,tl:dr解耦是如何工作的?可能需要一些小例子 我正在阅读编程Ruby——实用程序员指南。 (http://ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html) 这里有一个关于如何为子类KaraokeSong of Song实现to_s的示例 class KaraokeSong < Song # ... def to_s "KS: #{@name}--#{@artist} (#{@duration}) [#{@lyrics}]"

tl:dr解耦是如何工作的?可能需要一些小例子

我正在阅读编程Ruby——实用程序员指南。 (http://ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html)

这里有一个关于如何为子类KaraokeSong of Song实现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...]"
现在,当@duration变量仍然以毫秒为单位存储歌曲的持续时间时,新的to_s调用父方法如何解决问题?它仍然返回3750分钟,不是吗


我想我真的不明白这两首歌之间的区别。

我们假设
歌曲
能够正确地输出其
@持续时间

如果我们决定更改
Song
以毫秒为单位存储持续时间,我们将只更改
Song#to_s
方法,而不必将其所有子代的
更改为_s

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