Go语言实现面向对象

其实在Go语言中是没有面向对象的,但是Go语言的语法设计,我们可以借助结构体,方法,接口的实现,来模拟其他语言中的面向对象的概念。首先了解一下什么是面向对象,面向对象中的三大特征是:

  • 封装 在意义上是把许多客观的事物封装成一个抽象的类,把自己的属性 方法只让可信的对象操作。
  • 继承 子类可以访问父类的属性和方法,子类也可以拥有自己的属性和方法。子类可以重写父类的方法。
  • 多态 是指一个程序中同名的方法共存的情况,调用者只需使用同一个方法名,系统会根据不同情况,调用相应的不同方法,从而实现不同的功能。多态性又被称为“一个名字,多个方法”。

使用结构体来实现封装

package main

import "fmt"

// 定义结构体实现封装
type Person struct {
    Name string
    Age  int
}

// 使用方法创建一个新对象
func NewPerson(name string) *Person {
    return &Person{
        Name: name,
    }
}

// 使用SetAge方法设置结构体的Age字段
func (p *Person) SetAge(age int) {
    p.Age = age
}

// 使用GetAge方法获取结构体的Age字段
func (p *Person) GetAge() int {
    return p.Age
}

func main() {
    // 创建一个对象
    p := NewPerson("张三")
    // 设置年龄
    p.SetAge(18)
    // 获取年龄
    fmt.Println(p.GetAge()) // 18
}

继承的实现

继承可以解决代码复用的问题,结构体内嵌套一个匿名结构体,也可以嵌套多层结构体。

package main

import "fmt"

// 创建一个结构体,代表父类
type Father struct {
    Name string
    Age  int
}

// 创建一个结构体,代表子类
type Son struct {
    Father         // 匿名嵌套父类
    Address string // 子类独有属性
}

// 父类方法
func (f Father) FatherFunc() {
    fmt.Println("我是一名父亲,", f.Name, ",我今年", f.Age, "岁")
}

// 子类方法
func (s Son) SonFunc() {
    fmt.Println("我是一名儿子,我住在", s.Address)
}

// 子类重写父类方法
//func (s Son) FatherFunc() {
//    fmt.Println("这是子类的")
//}

func main() {
    // 创建一个父类对象
    f := &Father{Name: "张三", Age: 40}
    f.FatherFunc() // 我是一名父亲, 张三 ,我今年 40 岁

    // 创建一个子类对象
    s := &Son{Father{Name: "李四", Age: 10}, "北京"}
    fmt.Println(s.Name, s.Age, s.Address) // 李四 10 北京

    // 调用子类方法
    s.FatherFunc() // 我是一名父亲, 李四 ,我今年 10 岁
    s.SonFunc()    // 我是一名儿子,我住在 北京

    // 调用父类方法
    //s.FatherFunc() // 这是子类的
}

使用接口来实现多态

接口的意义是对其他类型的一个概括,接口内可以定义很多个方法,谁将这些方法实现,就可以认为是实现了该接口。Go语言的多态,主要是通过接口来实现。

package main

import "fmt"

func main() {
    t := Teacher{"老张"}
    fmt.Println(t.name)

    s := Student{"小明"}
    fmt.Println(s.name)

    PlayGame(t)

    var p Paratner
    p = &t
    p.PlayOW()

    s.PlayMC()

}

// 测试方法
func PlayGame(t Teacher) {
    t.PlayOW()
    t.PlayCS()
}

type Paratner interface {
    PlayOW()
    PlayCS()
}

// 实现类
type Teacher struct {
    name string
}

// 实现类
type Student struct {
    name string
}

// 实现方法
func (t *Teacher) PlayOW() {
    fmt.Println("老师-", t.name, "喜欢玩OW")
}

// 实现方法
func (t *Teacher) PlayCS() {
    fmt.Println("老师-", t.name, "喜欢玩CS")
}

// 实现方法
func (s *Student) PlayOW() {
    fmt.Println("学生-", s.name, "喜欢玩OW")
}

// 实现方法
func (s *Student) PlayCS() {
    fmt.Println("学生-", s.name, "喜欢玩CS")
}

// 实现自己的方法
func (s *Student) PlayMC() {
    fmt.Println("学生-", s.name, "还喜欢玩MC")
}

Last modification:November 18, 2022
If you think my article is useful to you, please feel free to appreciate