1.概念
鸭子类型,其实是一种动态类型的风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。摘自 维基百科-鸭子类型
2.代码实现
参见我们来看看Scala中鸭子类型如何实现,代码如下:
def withClose(closeAble: { def close(): Unit },
op: { def close(): Unit } => Unit) {
try {
op(closeAble)
} finally {
closeAble.close()
}
}
class Connection {
def close() = println("close Connection")
}
val conn: Connection = new Connection()
withClose(conn, conn =>
println("do something with Connection"))
我们定义了一个withClose的方法,接收2个参数:
- 一个有close方法的类型实例
- 一个接收这个实例,并且无返回值的函数
接着,我们定义了一个类Connection,给他定义了一个close()方法。最后再调用withClose方法,进行测试。
其实 维基百科-鸭子类型中那个伪代码的例子非常好,用鸭子类型就可以实现多态。感觉可以多看一下,仔细体会一下其中奥妙,我想这些特性也许就是FP最大的魅力!
3.思考
对于Python,Ruby,Lisp这些语言的程序员来说,这也只是一个很正常的特性。不过对于我这种一开始就接触JAVA的coder来说,这种特性还是很另人惊喜。 它避免了显式的去实现接口,省去了定义接口的麻烦,使得整个程序非常灵活。
其实现在的语言都在往这方面靠拢,比如golang,先定义好一个接口,以及方法申明。任何类只要实现了该接口的所有方法,即默认实现了该接口。从而避免掉显式的implemention
语法
作为一个scala学习的新手,真是对各种特性、语法应接不暇,7分惊喜3分悲痛啊。scala真是太博大了,作一个集合了面向对象与FP的语言。我只想说,东西太多了,掌握起来好累!