结构体的组合(类似面向对象的继承)

先声明一个类:

package main

import "fmt"

type Human struct {
    name string
    sex string
}

func (this *Human) Eat() {
    fmt.Println("Human.Eat()...")
}

func (this *Human) Walk() {
    fmt.Println("Human.Walk()...")
}

func main() {
    h := Human{"张三", "男"} // 使用大括号,内部填入相关类的属性值
    h.Eat()
    h.Walk()
}
  • 声明一个Human类

    • 有姓名、性别两个属性
    • 有Eat和Walk两个方法

运行结果:
image.png

现在要创建一个新的类来继承Human,并在此基础上添加一些新的属性和方法,重写原有的内容,扩展类的功能。

代码如下:

package main

import "fmt"

type Human struct {
    name string
    sex string
}

func (this *Human) Eat() {
    fmt.Println("Human.Eat()...")
}

func (this *Human) Walk() {
    fmt.Println("Human.Walk()...")
}

// ======================父类==================================
// 声明一个SuperMan类用来继承
type SuperMan struct {
    Human //SuperMan类继承了Human类的方法
    level int
}

// 重写父类的方法Eat()
func (this *SuperMan) Eat() {
    fmt.Println("SuperMan.Eat()...")
}

// 子类的新方法
func (this *SuperMan) Fly() {
    fmt.Println("SuperMan.Flay()...")
}

func (this *SuperMan) Print() {
    fmt.Println("name = ",this.name)
    fmt.Println("sex = ",this.sex)
    fmt.Println("level = ",this.level)
}

func main() {
    // h := Human{"张三", "男"} // 使用大括号,内部填入相关类的属性值
    // h.Eat()
    // h.Walk()

    // 实例化一个SuperMan类的对象
    // 写法一:在子类中首先声明父类相关的属性,之后再声明其他属性
    // s := SuperMan{Human{"李四", "男"}, 100}
    // 写法二:先声明对象,之后通过【.属性】来实例化对象的属性,提高可读性
    var s SuperMan // 使用var实例化一个对象
    s.name = "李四"
    s.sex="男"
    s.level = 100


    s.Walk() //父类的方法
    s.Eat() // 重写之后的子类的方法
    s.Fly() // 子类新建的方法
    s.Print()
}
  • 18-23行创建了SuperMan结构体,继承自Human,添加了新属性level
  • 25-28行重写了Eat方法
  • 31-33行添加子类了新的Fly方法
  • 35-39行添加新的方法打印子类的属性
  • 46-53行实例化子类

    • 47-48行方法1实例化时需要在{}内先声明继承的父类的属性
    • 49-54行方法2方法更利用可读性,先使用var声明对象,然后依次给属性赋值

运行结果:
image.png
可以看到成功继承了相关的属性,并且重写和新加的方法,在子类中都正常运行

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏