Go 继承和多态

go 语言并不是纯粹的面向对象语言,那么如何实现oop呢?

0x01 鸭子类型

go 通过接口来抽象,只要实现对应的接口, 那么它就是对应的类型。例如:走起来像鸭子, 那么我们就认为它是鸭子。go 是面向接口的编程。go通过接口来实现抽象。两个类型都是实现了对应的接口,那他们就是一类。

0x02 oop

go 语言的继承是通过组合的方式实现的。而多态是通过匿名继承的方式实现继承父类方法或者覆写父类的方法实现多态。

e.g:

package main

type CarFunc interface {
    Run()
}

type Car struct {

}

func (c *Car) Run(){
    fmt.Println("car run")
}

type BmwCar struct{
    Car
}

func main(){
    car := new(BmwCar)
    car.Run()
}

上面代码中,父类Car 实现了Run方法,子类继承了Car类型,但是没有实现Run方法,所以当BmwCar 类型对象,在使用Run方法 的时候是调用的父类的Run方法,如果BmwCar实现了自己的Run方法的时候,则调用BmwCar 类型的对象的Run方法的时候,则调用 的是BmwCar 自己的Run方法。 e.g:

package main

type CarFunc interface {
    Run()
}

type Car struct{

}

func (c *Car)Run() {
    fmt.Println("car run")
}

type BmwCar struct{
    Car
}

func (bc *BmwCar) Run(){
    fmt.Println("BMW run")
}

func main() {
    car := new(BmwCar)

    car.Run()
}

0x03 参考

鸭子类型