go学习随笔---go中的面向对象

所谓万物皆可对象,面向对象编程(oop)是一个很重要的编程思想,面向对象的核心:继承、多态;但go跟c++不一样,go没有c++的class,也没有继承的关键字,但是go依然可以实现oop。
以下通过一个简单例子来展示go语言中的面向对象。

继承

go中没有class,对于继承也没有任何关键字,但是go有type关键字,并且有struct,我们可用struct定义自己需要的类型,以下定义了三个struct,并且希望有一个父类Animal,两个子类Cat和Dog,如下:

type Animal struct {
    Name string
    mean bool
}

type Cat struct {
    Basics Animal
    MeowStrength int
}

type Dog struct {
    Animal
    BarkStrength int
}

在Cat和Dog中,都定义了Animal类型,Cat中定义了一个名为Basic的Animal类型,Dog中没有定义变量类型,这两种方式都可以,取决于个人习惯。

接着我们可以为各自的类实现他们的函数:

func (dog *Dog) MakeNoise() {
    barkStrength := dog.BarkStrength

    if dog.mean == true {
        barkStrength = barkStrength * 5
    }

    for bark := 0; bark < barkStrength; bark++ {
        fmt.Printf("BARK ")
    }

    fmt.Println("")
}

func (cat *Cat) MakeNoise() {
    meowStrength := cat.MeowStrength

    if cat.Basics.mean == true {
        meowStrength = meowStrength * 5
    }

    for meow := 0; meow < meowStrength; meow++ {
        fmt.Printf("MEOW ")
    }

    fmt.Println("")
}

多态

继承搞定了,我们看下go语言中的多态如何实现。go为我们提供了一个interface类型,我们可以借助interface来实现多态,如下:

type AnimalSounder interface {
    MakeNoise()
}

func MakeSomeNoise(animalSounder AnimalSounder) {
    animalSounder.MakeNoise()
}

我们将AnimalSounder定义为一个interface类型,AnimalSounder中包含了一个MakeNoise()函数。
在上一步中,Dog和Cat都实现了MakeNoise这个函数,那么我们就认为Dog和Cat都实现了AnimalSounder这个接口。

此外我们还定义了一个MakeSomeNoise函数,我们通过MakeSomeNoise实现了多态,入参就是接口。接着我们只需要对Cat和Dog做初始化,接着将初始化的对象作为参数传入MakeSomeNoise,即可实现多态,声明如下:

func main() {
    myDog := &Dog{
        Animal{
            "Rover", // Name
            false,   // mean
        },
        2, // BarkStrength
    }

    myCat := &Cat{
        Basics: Animal{
            Name: "Julius",
            mean: true,
        },
        MeowStrength: 3,
    }

    MakeSomeNoise(myDog)
    MakeSomeNoise(myCat)
}

完整代码:

package main

import (
    "fmt"
)

type Animal struct {
    Name string
    mean bool
}

type AnimalSounder interface {
    MakeNoise()
}

type Dog struct {
    Animal
    BarkStrength int
}

type Cat struct {
    Basics Animal
    MeowStrength int
}

func main() {
    myDog := &Dog{
        Animal{
            "Rover", // Name
            false,   // mean
        },
        2, // BarkStrength
    }

    myCat := &Cat{
        Basics: Animal{
            Name: "Julius",
            mean: true,
        },
        MeowStrength: 3,
    }

    MakeSomeNoise(myDog)
    MakeSomeNoise(myCat)
}

func (dog *Dog) MakeNoise() {
    barkStrength := dog.BarkStrength

    if dog.mean == true {
        barkStrength = barkStrength * 5
    }

    for bark := 0; bark < barkStrength; bark++ {
        fmt.Printf("BARK ")
    }

    fmt.Println("")
}

func (cat *Cat) MakeNoise() {
    meowStrength := cat.MeowStrength

    if cat.Basics.mean == true {
        meowStrength = meowStrength * 5
    }

    for meow := 0; meow < meowStrength; meow++ {
        fmt.Printf("MEOW ")
    }

    fmt.Println("")
}

func MakeSomeNoise(animalSounder AnimalSounder) {
    animalSounder.MakeNoise()
}

参考:
https://www.ardanlabs.com/blog/2013/07/object-oriented-programming-in-go.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容