Go语言实现面向对象
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")
}