这是逻辑: 服务器准备要通过HTTP响应发送的文件(如index.html或some.pdf)。根据后缀,我想在HTTP标头中设置Content-type。
现在的逻辑是我有类文件类型,有很多特定的文件类型子类扩展它。但我仍然需要使用" switch"识别后缀。类似的东西:
Filetype f = null;
if(suffix == "pdf"){
f = Filetype_pdf(source);
} else if (suffix == "html") {
f = Filetype_text(source);
}
但我使用继承只是为了避免这些"如果" s。对这个问题的任何建议还是应该是这样的?感谢。
答案 0 :(得分:1)
让我们说你有以下层次结构:
Filetype
HTMLType
PDFType
TxtType
现在假设这些类中的每一个都理解type
消息(而不是它们的实例,类)。然后,您可以在Filetype
中创建一个类方法,即classFor
,它接收一个参数extension
,并响应处理该Filetype
的{{1}}的子类。 extension
的实现包括枚举查找classFor
匹配type
的子类的所有子类。
在Smalltalk中,这看起来像
extension
当然,在classFor: extension
^Filetype allSubclasses detect: [:cls | cls type = extension]
的实现中某处有if
消息,但您的代码没有看到它并且优雅地表达了必须满足的条件。
修改强>
如果您添加(或删除)支持新类型文件的其他子类,则此方法的优点是检测到相应子类的方法detect
不会更改。这与必须详尽列出所有可能性的classFor
陈述形成对比。通过避免switch
您的代码获得了继续使用较新版本的层次结构所需的通用性。