持续更新中
1. 封装
2. 继承
3. 多态
在Go语言中,多态是通过接口来实现的,可以按照统一的接口来调用不同的实现,这时接口变量就呈现出不同的状态
话不多说,先上代码
1. 多态参数
package main
import (
"fmt"
)
type Usb interface {
// 声明两个没有实现的方法
Start()
Stop()
}
type Phone struct {
}
func (p Phone) Start() {
fmt.Println("手机开始工作...")
}
func (p Phone) Stop() {
fmt.Println("手机停止工作...")
}
type Camera struct {
}
func (c Camera) Start() {
fmt.Println("相机开始工作...")
}
func (c Camera) Stop() {
fmt.Println("相机停止工作...")
}
type Computer struct {
}
// 接收一个Usb接口类型变量,只要实现了Usb接口 (所谓实现了Usb接口,就是指实现了Usb接口声明的所有方法)
// 多态在python中通过方法来实现,在Go中通过接口来实现
func (c Computer) Working(usb Usb) {
// 通过usb接口变量来调用start和stop方法
usb.Start()
usb.Stop()
}
func main() {
computer := Computer{}
phone := Phone{}
computer.Working(phone)
camera := Camera{}
computer.Working(camera)
}
如上所示,我们并不关心是什么东西传入到了computer中,只要这个东西实现了Start()和Stop()这两个方法,我们就认为这个东西实现了usb接口,我们就可以通过computer去调用working去开始工作,这是典型的多态的实现
2. 多态数组
package main
import (
"fmt"
)
type Usb interface {
// 声明两个没有实现的方法
Start()
Stop()
}
type Phone struct {
PhoneNum string
}
func (p Phone) Start() {
fmt.Println("手机开始工作...")
}
func (p Phone) Stop() {
fmt.Println("手机停止工作...")
}
func (p Phone) Call() {
fmt.Printf("给 %s 打电话...\n", p.PhoneNum)
}
type Camera struct {
Name string
}
func (c Camera) Start() {
fmt.Println("相机开始工作...")
}
func (c Camera) Stop() {
fmt.Println("相机停止工作...")
}
func (c Camera) TakePhone() {
fmt.Printf("使用 %s 拍照\n", c.Name)
}
type Computer struct {
}
func (c Computer) Working(usb Usb) {
usb.Start()
// 这里使用了类型断言,通过不同的类型去执行不同的方法
switch usb.(type) {
case Phone:
usb.(Phone).Call()
case Camera:
usb.(Camera).TakePhone()
default:
fmt.Println("暂时不可识别的类型")
}
usb.Stop()
}
func main() {
var computer Computer
// 定义一个Usb接口数组,可以存放Phone和Camera结构体变量
var usbArr [3]Usb
usbArr[0] = Phone{"110"}
usbArr[1] = Phone{"120"}
usbArr[2] = Camera{"詹姆的相机"}
for _, usbIns := range usbArr {
computer.Working(usbIns)
}
}