[随笔] scala中的鸭子类型
coollzh
2011-09-29
class Duck { def quack = println( " duck quack" ); def walk = println( " duck walk" ); } class Platypus { def quack = println( "Platypus quack" ) def walk = println( "Platypus walk" ); } def actAsDuck( a : { def quack; def walk } ) = { a.quack a.walk } //a : { def quack; def walk } 是AnyRef类型,感觉scala还挺动态的 @Test def testDuck() { actAsDuck(new Duck ) } 关于鸭子类型的解释: 在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试(见下面的“历史”章节),“鸭子测试”可以这样表述: “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”[1][2] --摘自维基百科 http://zh.wikipedia.org/zh-cn/Duck_typing |
|
kidneyball
2011-09-29
动态语言的那种所谓鸭子类型,完全是概念上的,在实践中就是根本没有类型,按名称调用方法。偏偏又要说自己是什么鸭子类型,弄得好像很有理论体系似的,实际上就是乱来。你给我一个“鸭子类型”的A类,我不看它的实现代码或者文档,根本就不知道如何写一个B类来跟它配合。
如果按照鸭子类型的定义,scala这样的才算是鸭子类型,至少它先定义了一种类型,明确了一种调用协议。我拿到你的actAsDuck方法,至少从它的接口上就可以知道我要写一个带有quack和walk的东西去跟它结合。 |
相关讨论
相关资源推荐
- Eclipse开发入门与项目实践 源代码
- 浏览器客户端js中调用java代码 通过applet_通过javascript调用Applet程序对客户端文件系统进行操作...
- Eclipse常用功能
- eclipse 代码插件_使用Eclipse插件改进代码
- 玩转Eclipse — 自动代码规范检查工具Checkstyle
- Eclipse+Java+Swing实现电子商城
- Eclipse 快捷键失效,需要重启恢才能解决方法,以及Eclipse设置代码提示功能
- java applet 状态方法,JAVA/JSP学习系列之十四(JavaScript改变Applet状态)(译)
- 电脑上的Eclipse自动提示功能突然消失
- 扩展Alibaba P3C 实现自定义代码规范检查