tl:dr 解耦是如何工作的?可能需要一些小例子
我正在阅读Ruby编程 - 实用程序员指南。 (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以存储持续时间(以毫秒为单位)。突然之间,卡拉OK宋将开始报道荒谬的价值观。卡拉OK版“我的方式”的想法&#39;持续3750分钟是非常可怕的考虑。
相反,您应该使用super:
定义to_sdef to_s
super + " [#{@lyrics}]"
end
现在,当@duration变量仍然以毫秒为单位存储歌曲持续时间时,刚刚调用父方法的新 to_s 如何解决问题?它仍然会返回3750分钟,不是吗?
我想我真的不明白那两者之间的区别。
答案 0 :(得分:3)
假设Song
会处理其@duration
的正确输出。
如果我们决定更改Song
以存储持续时间(以毫秒为单位),我们只会更改Song#to_s
方法,而不必更改其所有后代的to_s
。< / p>