一文详解Go语言的面向对象

持续更新中

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)
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值