2

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 分钟,不是吗?

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

4

1 回答 1

3

假定Song它将处理其正确的输出@duration

如果我们决定改变Song以毫秒为单位存储持续时间,我们只需改变Song#to_s方法而不必改变to_s它的所有后代。

于 2012-06-30T11:18:38.520 回答