最近有稍微关注一下GO语言,在看到interface这块的时候有点小晕
package main
import (
"fmt"
"math"
)
type Abser interface {
Abs() float64
}
func main() {
var a Abser
f := MyFloat(-math.Sqrt2)
v := Vertex{3, 4}
a = f // a MyFloat 实现了 Abser
a = &v // a *Vertex 实现了 Abser
fmt.Println(a.Abs())
}
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
type Vertex struct {
X, Y float64
}
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
后面去论坛问了一些大神,说你只要知道ruby里面的duck type,就能搞懂这是怎么回事,于是我去回顾了一下ruby里duck type(多态)的定义
一个对象只要它像鸭子一样走路,像鸭子一样嘎嘎叫,那么解释器会很高兴的把它当做鸭子来对待的
什么意思?
class A
def hello
'it works'
end
end
class B
def hello
'it works2'
end
end
[A, B].each do |klass|
ins = klass.new
ins.hello
end
举个再常用一点的例子,一个数组里面有一个整数型,一个浮点数型,你对他们分别进行to_s, 都可以实现变成字符串
不得不感叹ruby语法的强大,对比其他语言的实现(c++中的纯虚函数,go里面的interface),ruby多态的实现是如此优雅!
我们接下来还是回到这段go语法中来解释一下interface的概念
Interface定义了一个或一组method(s),这些method(s)只有函数签名,没有具体的实现代码。若某个数据类型实现了Interface中定义的那些被称为"methods"的函数,则称这些数据类型实现(implement)了interface
代码中一开始定义了一个interface, 里面只有一个函数签名,并不需要实现这个函数
MyFloat和Vertex你可以理解为2个类(GO里面没有类,但是可以定义struct),这两个类都包含了Abs()方法,因此这两个类的对象(姑且称之为对象吧),都达到了Abser()这个接口的条件,实现了多态, 至于多态带来来的好处,这次就先不说了。
网友评论