tl:dr解耦是如何工作的?可能需要一些小例子
我正在阅读 Programming Ruby - The Pragmatic Programmer's Guide。(http://ruby-doc.org/docs/ProgrammingRuby/html/tut_classes.html)
有一个关于如何为Song 的子类 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...]"
现在他们说这是一种不好的方法:
假设我们决定将 Song 更改为以毫秒为单位存储持续时间。突然间,KaraokeSong 会开始报告荒谬的价值。持续 3750 分钟的卡拉 OK 版“My Way”的想法实在是太可怕了,无法考虑。
相反,您应该使用 super 定义 to_s:
def to_s
super + " [#{@lyrics}]"
end
现在当@duration变量仍然以毫秒为单位存储歌曲时长时,刚刚调用父方法的新to_s如何解决问题?它仍然返回 3750 分钟,不是吗?
我想我真的不明白这两个之间的区别。