golang怎么继承

2023-05-22 15:05:55 继承 Golang

Go语言中,没有传统面向对象语言中所定义的“类”,因此不存在所谓的“继承”。但是,Go语言提供了一种通过组合实现类似继承的方法,叫做嵌入(Embedding)。

嵌入可以让我们将一个类型嵌入到另一个类型中,这样被嵌入的类型就可以直接访问嵌入它的类型的属性和方法,而无需通过接口或者其他方式来访问。这个过程类似于传统的“继承”,但是更加灵活。

下面,我们将通过几个例子来演示如何使用嵌入实现类似继承的功能。

  1. 基础例子

我们先定义几个基础的结构体,狗、猫和人:

type Dog struct {
    name string
}

func (d Dog) Bark() {
    fmt.Println(d.name, ": 汪汪汪!")
}

type Cat struct {
    name string
}

func (c Cat) Mew() {
    fmt.Println(c.name, ": 喵喵喵!")
}

type Person struct {
    name string
}

func (p Person) Speak() {
    fmt.Println(p.name, ": 你好!")
}

现在我们要创建一种动物类型,它可以“继承”狗和猫,并且还有自己的属性和方法,比如颜色和奔跑的速度。我们可以这样来定义:

type Animal struct {
    Dog
    Cat
    color       string
    runSpeed    int
}

func (a Animal) Run() {
    fmt.Println(a.color, "的动物以", a.runSpeed, "km/h的速度奔跑!")
}

在这个定义中,Animal类型嵌入了Dog和Cat类型。这意味着Animal类型实例化的对象可以直接访问Dog和Cat类型的属性和方法。我们也可以给Animal类型定义自己的属性和方法,比如color和runSpeed,用来表示动物的颜色和奔跑的速度,并且定义一个Run方法来描述动物的奔跑动作。

现在我们来创建一个Animal对象,看看它是如何工作的:

func main() {
    d := Dog{name: "小黑"}
    c := Cat{name: "小白"}
    a := Animal{d, c, "黑白相间", 50}
    a.Bark()    // 小黑 : 汪汪汪!
    a.Mew()     // 小白 : 喵喵喵!
    a.Run()     // 黑白相间 的动物以 50 km/h的速度奔跑!
}

我们可以看到,通过嵌入Dog和Cat类型,Animal对象可以直接调用Bark和Mew方法,而无需使用接口或其他方式。这种方式可以让我们在不使用传统意义上的“继承”情况下实现类似的功能。

  1. 嵌入自定义类型

我们可以将一个自定义类型嵌入到另一个自定义类型中,实现类似继承的效果。现在,我们来定义一个Person类型和一个Student类型,并将Person类型嵌入到Student类型中:

type Person struct {
    name string
    age  int
    sex  string
}

type Student struct {
    Person
    class string
    score float64
}

在这个定义中,Student类型嵌入了Person类型。实例化Student类型对象的时候,可以使用Person的属性和方法。比如,我们可以实例化一个学生对象,设置他的姓名、年龄、性别、班级和成绩:

func main() {
    s := Student{
        Person: Person{
            name: "小明",
            age:  18,
            sex:  "男",
        },
        class: "高三一班",
        score: 92.5,
    }
    fmt.Println("姓名:", s.name)
    fmt.Println("年龄:", s.age)
    fmt.Println("性别:", s.sex)
    fmt.Println("班级:", s.class)
    fmt.Println("成绩:", s.score)
}

当我们运行这个程序时,可以看到输出如下:

姓名: 小明
年龄: 18
性别: 男
班级: 高三一班
成绩: 92.5

我们可以看到,Student对象可以直接访问Person类型对象的属性和方法,包括name、age和sex等属性。

  1. 嵌套嵌入

在一个类型中嵌套多个类型也是可以的。我们可以将Animal类型嵌入到另一个类型中,来实现更多的功能。比如,我们现在来定义一个Zoo类型:

type Zoo struct {
    Animal
    name    string
    address string
}

func (z Zoo) ShowInfo() {
    fmt.Println("这是", z.name, ", 地址是", z.address)
    z.Run()
}

在这个类型的定义中,我们将Animal类型嵌入到Zoo类型中。这样,Zoo类型可以直接访问Animal类型的属性和方法,包括Run方法。我们再定义一个ShowInfo方法来输出动物园的名称和地址,并且调用Animal类型的Run方法来展示动物们的奔跑。

现在,我们创建一个动物园对象,并测试它的方法:

func main() {
    d := Dog{name: "小黑"}
    c := Cat{name: "小白"}
    a := Animal{d, c, "黑白相间", 50}
    z := Zoo{a, "北京动物园", "北京市海淀区清华科技园路"}
    z.ShowInfo()
}

当我们运行这个程序时,可以看到输出如下:

这是 北京动物园 , 地址是 北京市海淀区清华科技园路
黑白相间 的动物以 50 km/h的速度奔跑!

我们可以看到,通过将Animal类型嵌套到Zoo类型中,我们可以创建出具有更多功能的类型,可以展示动物园的信息和动物们的奔跑动作。

总结

虽然在Go语言中没有传统面向对象语言所定义的类和继承的概念,但是嵌入的概念可以让我们在不使用传统的继承方式的情况下,实现类似的功能,更加灵活和方便。通过以上的例子,我们可以看到,嵌入可以轻松创建一个包含子类型的类型,并且可以方便地调用它们的方法和属性。

以上就是golang怎么继承的详细内容,更多请关注其它相关文章!

相关文章