(三十五)golang--面向对象之多态
时间:2022-07-23
本文章向大家介绍(三十五)golang--面向对象之多态,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
多态:变量具有多种形态,可以用统一的接口来调用不同的实现。
接口体现多态特征:
(1)多态参数:之前所讲的Usb接口案例,既可以接受手机变量,也可以接受相机变量,就体现了usb接口的多态;
(2)多态数组:
package main
import (
"fmt"
)
type usb interface {
start()
stop()
}
type phone struct {
name string
}
func (p phone) start() {
fmt.Println(p.name, "手机开始工作")
}
func (p phone) stop() {
fmt.Println(p.name, "手机停止工作")
}
type camera struct {
name string
}
func (c camera) start() {
fmt.Println(c.name, "相机开始工作")
}
func (c camera) stop() {
fmt.Println(c.name, "相机停止工作")
}
type computer struct {
}
func (co computer) working(usb usb) {
usb.start()
usb.stop()
}
func main() {
var usbArr [3]usb
usbArr[0] = phone{"小米"}
usbArr[1] = phone{"vivo"}
usbArr[2] = camera{"尼康"}
fmt.Println(usbArr)
for i := 0; i < len(usbArr); i++ {
usbArr[i].start()
usbArr[i].stop()
}
}
我们以前讲到,数组是只能存储同一种类型的数据,利用多态数组,就可以存储不同的类型了;
如何将一个接口变量赋值给一个自定义类型的变量?使用类型断言
类型断言:由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言;要保持原来空接口指向的数据类型和断言的数据类型一致;
为了避免输出panic报错,可以进行断言判断;
类型断言实践一:
我们给phone中加入一个方法call(),在调用usb变量时,usb.call(),肯定是不对的,因为usb可能是phone,也可能是camera,而camera是没有这个函数的,因此,在调用的时候用类型断言。
package main
import (
"fmt"
)
type usb interface {
start()
stop()
}
type phone struct {
name string
}
func (p phone) start() {
fmt.Println(p.name, "手机开始工作")
}
func (p phone) call() {
fmt.Println(p.name,"手机在打电话")
}
func (p phone) stop() {
fmt.Println(p.name, "手机停止工作")
}
type camera struct {
name string
}
func (c camera) start() {
fmt.Println(c.name, "相机开始工作")
}
func (c camera) stop() {
fmt.Println(c.name, "相机停止工作")
}
type computer struct {
}
func (co computer) working(usb usb) {
usb.start()
//如果usb还指向phone的结构体变量,则还需要调用call方法
if phone, ok := usb.(phone); ok {
phone.call()
}
usb.stop()
}
func main() {
var usbArr [3]usb
usbArr[0] = phone{"小米"}
usbArr[1] = phone{"vivo"}
usbArr[2] = camera{"尼康"}
var com computer
fmt.Println(usbArr)
for i := 0; i < len(usbArr); i++ {
com.working(usbArr[i])
}
}
类型断言实践2:循环判断输入参数的类型
package main
import (
"fmt"
)
type student struct {
name string
}
func typeJudge(items ...interface{}) {
for index, x := range items {
switch x.(type) {
case bool:
fmt.Printf("第%v个参数是bool类型,值是%vn", index, x)
case int, int32, int64:
fmt.Printf("第%v个参数是整数类型,值是%vn", index, x)
case float32:
fmt.Printf("第%v个参数是float32类型,值是%vn", index, x)
case float64:
fmt.Printf("第%v个参数是float64类型,值是%vn", index, x)
case string:
fmt.Printf("第%v个参数是string类型,值是%vn", index, x)
case student:
fmt.Printf("第%v个参数是student类型,值是%vn", index, x)
case *student:
fmt.Printf("第%v个参数是*student类型,值是%vn", index, x)
default:
fmt.Printf("第%v个参数类型不确定,值是%vn", index, x)
}
}
}
func main() {
var n1 float32 = 1.1
var n2 float64 = 1.2
var n3 int32 = 1
var name string = "tom"
var n5 bool = true
stu1 := student{"jack"}
stu2 := &student{"bob"}
typeJudge(n1, n2, n3, name, n5, stu1, stu2)
}
- Python time模块详解(时间戳↔元组形式↔格式化形式三者转化)
- Maven 核心原理解析(2)
- Linux C 编程——互斥锁mutex
- python两个 list 获取交集,并集,差集的方法.
- python——时间与时间戳之间的转换
- Maven 核心原理解析(3)
- String中的null,以及String s;等区别详解
- Shell编程——Shell中的数学运算
- 如何利用微信监管你的TF训练?
- python 安装spark_Spark环境搭建 (Python)
- MongoDB触发oom-killer的简单处理(一)(r7笔记第54天)
- int与integer的区别
- java 自动装箱与拆箱
- python读取文件——python读取和保存mat文件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何利用SNMP实现网络攻击缓解?
- winform总结5> winform程序开发注意事项
- mvc文件上传支持批量上传,拖拽以及预览,文件内容校验
- .net Core 1.0.1 下的Web框架的的搭建过程step by step
- 蓝牙芯片----BK34341开发笔记------快速入门(2)
- .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件
- 蓝牙芯片----BK3431开发笔记------基本外部驱动应用(3)
- .net core 利用中间件处理常见的网站功能 包括 session、routers、重定向、重写和文件下载
- 蓝牙芯片----BK3431开发笔记------RW stack中添加自定义服务教程(4)
- 图像简单处理
- 蓝牙---BLE GATT介绍
- Access数据库密码破解 C#
- 没啥用,更换注册表信息使webbrower选择适合的版本
- linux下分割和合并压缩包
- 编译.net .net Core程序 代码,仅做备份