首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用多态性代替开关

用多态性代替开关
EN

Stack Overflow用户
提问于 2015-01-11 23:48:55
回答 1查看 121关注 0票数 1

逻辑如下:服务器准备通过HTTP响应发送的文件(如index.html或some.pdf)。基于后缀,我想在HTTP报头中设置内容类型。

现在的逻辑是,我有类文件类型,并有许多特定的文件类型子类对其进行扩展。但我仍然需要使用“开关”来识别后缀。类似于:

代码语言:javascript
运行
复制
Filetype f = null;
if(suffix == "pdf"){
    f = Filetype_pdf(source);
} else if (suffix == "html") {
    f = Filetype_text(source);
}

但是我使用继承只是为了避免这些“如果”。对这个问题有什么建议吗?还是应该这样?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-12 00:56:43

假设您有以下层次结构:

代码语言:javascript
运行
复制
Filetype
    HTMLType
    PDFType
    TxtType

现在假设这些类中的每一个都理解type消息(而不是它们的实例,类)。然后,您可以在Filetype中创建一个类方法,即classFor,它接收一个参数extension,并响应处理该extensionFiletype子类。classFor的实现包括枚举所有子类,查找typeextension匹配的子类。

在Smalltalk中,这看起来就像

代码语言:javascript
运行
复制
classFor: extension
    ^Filetype allSubclasses detect: [:cls | cls type = extension]

当然,在if的实现中有一个detect消息,但是您的代码没有看到它,并且很好地表达了必须满足的条件。

编辑:

如果这种方法的优点是,如果添加(或删除)支持新类型文件的其他子类,则检测适当子类的方法classFor不会更改。这与switch语句形成鲜明对比,该语句必须详尽地命名所有可能性。通过避免switch,您的代码获得了继续使用较新版本的层次结构所需的通用性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27893464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档