时间:2021.09.22
环境:
目的:简易阐述Go语言"面向对象"三大特性
说明:
作者:Zhong QQ交流群:121160124 欢迎加入!
编程语言面向对象开发中的三大特性:封装、继承和多态,在Go语言中是怎么实现的呢?首先需要了解这个问题:
Go 是否是面向对象语言?
Go语言并没有严格的说明是否是面向对象编程语言,但相应的特性都有对应的实现!
封装
对于封装简单来说就是将一些功能的实现代码封装在一个个方法、模块或包中,形成结构清晰功能分明的层次,在使用时调用相关方法即可。
继承
Go语言之中没有继承的概念 使用(类型)组合替代了其它面向对象开发语言里的继承
下面通过一段代码来体现Go语言中的继承
package main
import (
"fmt"
)
type Monkey struct {
Name string
Age int
}
func (m *Monkey) Climb() {
fmt.Println(m.Name, "会爬树")
}
type Wukong struct {
Monkey
Alias string
}
func (w *Wukong) Fly() {
fmt.Println(w.Alias, "通过拜师学艺,学会了飞")
}
func main() {
wukong := Wukong{
Monkey{
Name: "SunWukong",
Age: 18,
},
"齐天大圣",
}
wukong.Climb()
wukong.Fly()
fmt.Println(wukong.Name)
}
多态
Go语言通过接口实现了多态和扩展功能 也起到了规范的作用
下面通过一段代码来体现Go语言中的多态
package main
import (
"fmt"
)
// 定义一个Usb接口 包含两个方法
type Usb interface {
Insert()
Takeout()
}
// 定义一个Computer
type Computer struct {
}
type Phone struct {
}
type Camera struct {
}
type Pod struct {
}
// Computer有一个Working方法 接收一个Usb接口类型参数并调用两个方法
func (c Computer) Working(u Usb) {
u.Insert()
// 如果是Phone类型 调用Phone特有的Charge()方法
if phone, ok := u.(Phone); ok {
phone.Charge()
}
u.Takeout()
fmt.Println()
}
// Phone实现了Insert和Takeout方法 也实现了Usb接口
func (p Phone) Insert() {
fmt.Println("手机已插入接口")
}
// Phone特有的方法
func (p Phone) Charge() {
fmt.Println("手机已开始充电")
}
func (p Phone) Takeout() {
fmt.Println("手机已拔出接口")
}
// Camera实现了Insert和Takeout方法 也实现了Usb接口
func (c Camera) Insert() {
fmt.Println("相机已插入接口")
}
func (c Camera) Takeout() {
fmt.Println("相机已拔出接口")
}
// Pod没有同时实现Insert和Takeout方法 所以没有实现Usb接口
func (p Pod) Insert() {
fmt.Println("Pod已插入接口")
}
// func (p Pod) Takeout() {
// fmt.Println("Pod已拔出接口")
// }
func main() {
// 创建一个Computer对象
computer := Computer{}
// 创建Phone、Camera对象
phone := Phone{}
camera := Camera{}
// computer调用Working方法 传递任意一个实现了Usb接口的对象
computer.Working(phone)
computer.Working(camera)
// pod不能被computer调用
// pod := Pod{}
// computer.Working(pod)
}
关注微信公众号 加入qq交流群 121160124