Go 语言中的 继承、多态

66 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

go语言相对来讲不是一门绝对的面向对象的语言,没有像java那样,所有操作都是类操作的堆堆砌,没有类似于class 的设计,与之类似的在go 中的内容是struct ,struct 的存在可以类似的帮助我们实现一些面向对象的操作,比如说继承和多肽。

继承

我们定义两个结构体,一个Person ,一个Student, Student 继承Person 的特征并且拥有一些自己的属性和方法。我们一般使用go 的特性struct 结构体可以嵌套特性来实现这一功能。

这里使用了两种继承方式,一种是 student1 、一种是student2 ,这两种方式在调用父类的方式有些许差别,不过我们经常使用的方式是 student1

  • 方式1 (常用) 用了一些小技巧,在go 里边儿,可以直接使用 变量类型作为值的名称

  • 方式2 (普通方式,当写继承结构时候我们不太常用这种结构)



type Person struct {
   name string
   age int
}

// 方式1
type Student1 struct {
   Person
   class string
   grade int
}

// 方式2
type Student2 struct {
   person Person
   class string
   grade int
}

func (this Person) sleep() {
   fmt.Printf("start sleep ··zzzzzz")
}

func (this Student1) sleep() {
   fmt.Printf("i am a student , i can sleep ")
}

func (this Student1) exam1() {
   fmt.Printf("i am student1, start exam ````")
}
func (this Student2) exam2()  {
   fmt.Printf("i am student2 , start exam")
}

调用

很明显方式1 调用结构更加简单


func main() {
   p := Person{
      name: "xiaoming",
      age:  19,
   }
   user1 := Student1{
      Person: p,
      class:  "二年级(一班)",
      grade:  99,
   }
   user2 := Student2{
      person: p,
      class:  "高三(二班)",
      grade:  150,
   }
   
    // 方法重载
    // 调用“子类”sleep
    user1.sleep()
    //调用 “父类” sleep
    user1.Person.sleep()

    
    
   // 方式1 
   fmt.Println(user1.name,user1.age,user1.class,user1.grade)
   
   //方式2
   fmt.Println(user2.person.name,user2.person.age,user2.class,user2.grade)

}

多态

go 的多态是通过接口来实现的,go 语言实现接口不和java 一样,不需要显示的声明实现了哪个接口,这样更好的实现了程序之间的解耦,从而使代码更加简洁。

type sleep interface {
   sleep()
}

type Person struct {
   name string
   age int
}

// 方式1
type Student1 struct {
   Person
   class string
   grade int
}

// 方式2
type Student2 struct {
   person Person
   class string
   grade int
}

func (this Person) sleep() {
   fmt.Printf("start sleep ··zzzzzz")
}

func (this Student1) sleep() {
   fmt.Printf("i am a student , i can sleep ")
}

// sleep 接口
func tosleep(user sleep) {
   user.sleep()
}


func main() {
   p := Person{
      name: "xiaoming",
      age:  19,
   }
   user1 := Student1{
      Person: p,
      class:  "二年级(一班)",
      grade:  99,
   }
   user2 := Student2{
      person: p,
      class:  "高三(二班)",
      grade:  150,
   }

   tosleep(user1)
   tosleep(p)

}