Go语言中没有类继承,要用多态怎么办?

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语言里面接口的使用和多态的实现。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190803A03KVP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券