Go语言中没有类继承,要用多态怎么办?
这一期我们继续来了解一下go语言。这些专门了解接口。大家知道,go语言里面是不存在类继承的。那这是不是意味着,go语言里就无法实现多态呢?
结构,大家一定很熟悉了。我们先看一个结构的例子。
现在我们定义一个结构, shape. 比如这样:
type shape struct{
}
因为结构内部不能包含方法,所以我们额外定义一个方法。
func (s shape)hasArea(type string) bool {
if type == "line"
return false
else
return true
}
因为shape是抽象的概念, 没有具体指向的时候,是无法使用的。
所以我们还要定义另外一个具体的shape, 比如说正正方形。
那我们就需要这样。
type square struct{
shape
length int
}
在上面的这个定义中我们嵌入了上面定义的shape结构。
在实用中我们可以这样用:
sq := square, 123}
fmt.Pringln("Has area?", sq.hasArea())
上面这个例子是典型的面向对象的编程, 使用的是强类型。强类型情况下是无法实现多态的。那么在go语言中,我们有没有办法实现多态呢?
我们以前说的go语言是不支持类继承的, 其实go语言也是可以实现多态的, 接口正是Go语言里面实现多态的方法。
我们来看一下如何使用接口来实现多态, 同样还是上面的例子, 如果使用接口的话就可以这么写:
type shape interface{
hasArea(name string)bool
}
type square struct {
length int
}
func (sq square)hasArea(type string) bool {
if type == "line"
return false
else
return true
}
使用的时候可以这样:
sq := square
fmt.Pringln("Has area?", sq.hasArea())
或者这样
var sq shape
sq = square
fmt.Pringln("Has area?", sq.hasArea())
从上面的例子可以看出,任何能够匹配以上接口中函数定义的结构对象, 都可以使用这个接口类型。
这样做,就在go语言实现多态了。
怎么样? 有没有感觉这个多态实现起来太容易了? 这就是go语言里面接口的使用和多态的实现。
领取专属 10元无门槛券
私享最新 技术干货