逻辑如下:服务器准备通过HTTP响应发送的文件(如index.html或some.pdf)。基于后缀,我想在HTTP报头中设置内容类型。
现在的逻辑是,我有类文件类型,并有许多特定的文件类型子类对其进行扩展。但我仍然需要使用“开关”来识别后缀。类似于:
Filetype f = null;
if(suffix == "pdf"){
f = Filetype_pdf(source);
} else if (suffix == "html") {
f = Filetype_text(source);
}但是我使用继承只是为了避免这些“如果”。对这个问题有什么建议吗?还是应该这样?谢谢。
发布于 2015-01-12 00:56:43
假设您有以下层次结构:
Filetype
HTMLType
PDFType
TxtType现在假设这些类中的每一个都理解type消息(而不是它们的实例,类)。然后,您可以在Filetype中创建一个类方法,即classFor,它接收一个参数extension,并响应处理该extension的Filetype子类。classFor的实现包括枚举所有子类,查找type与extension匹配的子类。
在Smalltalk中,这看起来就像
classFor: extension
^Filetype allSubclasses detect: [:cls | cls type = extension]当然,在if的实现中有一个detect消息,但是您的代码没有看到它,并且很好地表达了必须满足的条件。
编辑:
如果这种方法的优点是,如果添加(或删除)支持新类型文件的其他子类,则检测适当子类的方法classFor不会更改。这与switch语句形成鲜明对比,该语句必须详尽地命名所有可能性。通过避免switch,您的代码获得了继续使用较新版本的层次结构所需的通用性。
https://stackoverflow.com/questions/27893464
复制相似问题