使用多态而不是Switch

时间:2015-01-11 23:48:56

标签: oop

这是逻辑: 服务器准备要通过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。对这个问题的任何建议还是应该是这样的?感谢。

1 个答案:

答案 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您的代码获得了继续使用较新版本的层次结构所需的通用性。