[随笔] 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的东西去跟它结合。
Global site tag (gtag.js) - Google Analytics