golang面向对象编程思想-多态

一、基本介绍

实例具有多种形态。面向对象的三大特性,在GO语言中,多态的特征通过接口实现的,可以按照统一的接口来调用不同的实现,这时接口变量就是不同的形态.

package main

import (
	"fmt"
)

type Usb interface {
	Start()
	Stop()
}
type Phone struct {
}

// 让Phone实现Usb接口方法
func (phone Phone) Start() {
	fmt.Println("手机开始工作...")
}

func (phone Phone) Stop() {
	fmt.Println("手机停止工作...")
}

type Camera struct {
}

// 让Camera实现Usb接口方法
func (camera Camera) Start() {
	fmt.Println("相机开始工作...")
}

func (camera Camera) Stop() {
	fmt.Println("相机停止工作...")
}

type Computer struct {
}

// 编写一个方法Working方法,接收一个Usb接口类型变量
// 只要是实现了Usb接口,(所谓实现Usb接口,就是指实现了Usb接口声明所有方法)
func (computer Computer) Working(usb Usb) { // usb变量会根据传入的实参,来判断到底是Phone还是Camera
	// 通过usb接口变量来调用Start和Stop方法
	usb.Start()
	usb.Stop()
}

func main() {

	computer := Computer{}
	phone := Phone{}
	computer.Working(phone)
	camera := Camera{}
	computer.Working(camera)
}

输出结果:

手机开始工作...
手机停止工作...
相机开始工作...
相机停止工作...

二、接口体现多态特性

  1. 多态参数
    在前面的Usb接口案例,Usb usb,即可以接收手机变量,又可以接收相机变量,就实现了Usb接口多态

  2. 多态数组

package main

import (
	"fmt"
)

type Usb interface {
	Start()
	Stop()
}
type Phone struct {
	Name string
}

// 让Phone实现Usb接口方法
func (phone Phone) Start() {
	fmt.Println("手机开始工作...")
}

func (phone Phone) Stop() {
	fmt.Println("手机停止工作...")
}

func (phone Phone) Call() {
	fmt.Println("手机可以打电话...")
}

type Camera struct {
	Name string
}

// 让Camera实现Usb接口方法
func (camera Camera) Start() {
	fmt.Println("相机开始工作...")
}

func (camera Camera) Stop() {
	fmt.Println("相机停止工作...")
}

func main() {

	var usbArr [3]Usb
	usbArr[0] = Phone{"小米"}
	usbArr[1] = Phone{"vivo"}
	usbArr[2] = Camera{"尼康"}
	for _, v := range usbArr {
		v.Start()
		v.Stop()
		if phone, ok := v.(Phone); ok {
			phone.Call()
		}
	}
}

输出结果:

手机开始工作...
手机停止工作...
手机可以打电话...
手机开始工作...
手机停止工作...
手机可以打电话...
相机开始工作...
相机停止工作...
上一篇:源代码波浪粒子鼠标跟随3D动画效果


下一篇:2021-05-25