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

2019-08-03  本文已影响0人  丁哥开讲

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{shape{}, 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{123}

fmt.Pringln("Has area?", sq.hasArea())

或者这样

var sq shape

sq = square{123}

fmt.Pringln("Has area?", sq.hasArea())

从上面的例子可以看出,任何能够匹配以上接口中函数定义的结构对象, 都可以使用这个接口类型。

这样做,就在go语言实现多态了。

怎么样? 有没有感觉这个多态实现起来太容易了? 这就是go语言里面接口的使用和多态的实现。

上一篇 下一篇

猜你喜欢

热点阅读