golang 面向对象编程

目录

golang 里面没有 class 关键字,但是却可以用 struct 和 interface 实现面向对象的思想。我认为这个设计非常棒,可以减少使用者在编程时的心智负担。
越用 golang 越发佩服 golang 设计者们的智慧,真的是做到了“重剑无锋,大巧不工”,抛弃掉在编程时强加给人的心智负担,用最简单直观的方式实现。

golang 面向对象编程

类定义

// 定义一个 people 类包含 Name 这个属性
type People struct {
  Name string
}

类方法

// 给 people 类增加 3 个方法

func (this *People) GetName() string {
  return this.Name

}

func (this *People) SpeakName() {
  fmt.Println(this.Name)

}

func (this *People) Sleep() {
  fmt.Println("sleep....")

}

类继承

// chinese 类继承了 People 类

type Chinese struct {
  People
}
type American struct {
  People
}

多态

// 覆盖父类的方法

func (this *Chinese) SpeakName() {
  str := "我是" + this.Name
  fmt.Println(str)

}

func (this *American) SpeakName() {
  str := "my name is " + this.Name
  fmt.Println(str)
}

接口

// 在 golang 中只要实现了 interface 中定义的方法,那么就可以看做实现了这个接口
// 所以 golang 中的 interface 和实现是解耦合的,这点非常棒。
type TheThingHaveName interface {
  GetName() string
}

func SayName(thing TheThingHaveName) {
  fmt.Println(thing.GetName())

}

func main() {

  var jimila Chinese
  jimila.Name = "jimila"
  jimila.SpeakName()
  jimila.Sleep()

  var jack American
  jack.Name = "jack"
  jack.SpeakName()
  jack.Sleep()

  SayName(&jimila)
  SayName(&jack)

}

横向和纵向抽象

类可以看做一种纵向的抽象,类中包含了各种不同的方法。而接口可以看做是方法的横向抽象,我们从各种类中提取出公用的方法定义为接口。

golang_oop_1.png

目录