面向对象编程-多态

基本介绍

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

快速入门

之前的 Usb 接口案例,Usb usb ,既可以接收手机变量,又可以接收相机变量,就体现了 Usb 接 口 多态特性。

接口体现多态的两种形式

  • 多态参数
    在前面的 Usb 接口案例,Usb usb ,即可以接收手机变量,又可以接收相机变量,就体现了 Usb 接 口 多态。
  • 多态数组
    演示一个案例:给 Usb 数组中,存放 Phone 结构体 和 Camera 结构体变量 案例说明:
package main import ("fmt"
)//声明/定义一个接口
type Usb interface {//声明了两个没有实现的方法 Start()Stop()
}type Phone struct { name string
}//让 Phone 实现 Usb 接口的方法
func (p Phone) Start() { fmt.Println("手机开始工作。。。")
}func (p Phone) Stop() { fmt.Println("手机停止工作。。。")
}type Camera struct { name string
}//让 Camera 实现  Usb 接口的方法
func (c Camera) Start() { fmt.Println("相机开始工作。。。")
}func (c Camera) Stop() {fmt.Println("相机停止工作。。。")
}func main() {//定义一个 Usb 接口数组,可以存放 Phone 和 Camera 的结构体变量//这里就体现出多态数组 var usbArr [3]Usb usbArr[0] = Phone{"vivo"} usbArr[1] = Phone{"小米"}usbArr[2] = Camera{"尼康"}fmt.Println(usbArr)
}

类型断言

由一个具体的需要,引出了类型断言.
基本介绍

类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言, 具体的如下:

  • 对上面代码的说明:
    在进行类型断言时,如果类型不匹配,就会报 panic, 因此进行类型断言时,要确保原来的空接口 指向的就是断言的类型.
  • 如何在进行断言时,带上检测机制,如果成功就 ok,否则也不要报 panic
  1. 类型断言的最佳实践 一
    在前面的 Usb 接口案例做改进:
    给 Phone 结构体增加一个特有的方法 call(), 当 Usb 接口接收的是 Phone 变量时,还需要调用 call方法
package main
import ("fmt"
)//声明/定义一个接口
type Usb interface {//声明了两个没有实现的方法 Start()Stop()
}type Phone struct { name string
}//让 Phone 实现 Usb 接口的方法
func (p Phone) Start() { fmt.Println("手机开始工作。。。")
}func (p Phone) Stop() { fmt.Println("手机停止工作。。。")
}func (p Phone) Call(){fmt.Println("手机打电话")
}type Camera struct { name string
}//让 Camera 实现  Usb 接口的方法
func (c Camera) Start() { fmt.Println("相机开始工作。。。")
}func (c Camera) Stop() {fmt.Println("相机停止工作。。。")
}type Computer struct{}func (computer Computer) Working(usb Usb){usb.Start()//如果usb结构体是指向Phone结构题,还需要调用Call方法if phone, ok := usb.(Phone); ok {phone.Call()}usb.Stop()
}func main() {//定义一个 Usb 接口数组,可以存放 Phone 和 Camera 的结构体变量//这里就体现出多态数组 var usbArr [3]Usb usbArr[0] = Phone{"vivo"} usbArr[1] = Phone{"小米"}usbArr[2] = Camera{"尼康"}//遍历数组//Phone 还有一个特有的方法 call(),请遍历 Usb 数组,如果是 Phone 变量,//除了调用 Usb 接口声明的方法外,还需要调用 Phone 特有方法 call. =》类型断言 var computer Computerfor _, v := range usbArr{computer.Working(v)fmt.Println()}// fmt.Println(usbArr)
}
  1. 类型断言的最佳实践二:写一函数,循环判断传入参数的类型:

Golang笔记-面向对象编程-多态/类型断言相关推荐

  1. Golang笔记—面向对象编程

    工厂模式 说明 Golang 的结构体没有构造函数,通常可以使用工厂模式来解决这个问题. 看一个需求 一个结构体的声明是这样的: package model type Student struct { ...

  2. [Java入门笔记] 面向对象编程基础(二):方法详解

    2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...

  3. Python面向对象编程---多态

    Python面向对象编程-多态 定义: 是一种使用对象的方式,子类重写父类的方法(非必须),调用不同子类对象的相同父类方法,可以产生不同的执行结果,简言之就是:传入不同的对象,产生不同的结果. 好处: ...

  4. JavaScript学习笔记---面向对象编程-JS高级部分(pink老师)

    目录 一.面向对象编程介绍 1.1 两大编程思想 1.面向过程编程POP(Process-Oriented Programming) 2.面向对象编程OOP(Object Oriented Progr ...

  5. 12 第十二节课笔记(面向对象编程)

    一.面向对象:是一种思维,使用这种思维设计的程序能够将数据和对数据进行的 操作封装在一起组成一个类,可以同多创建对象,通过对象之间的交互来解决问题. 二.面向对象编程(OOP:Object,Orien ...

  6. Golang笔记——tcp 编程

    看两个实际应用 QQ,迅雷,百度网盘客户端. 新浪网站,京东商城,淘宝. 网络编程基本介绍 Golang 的主要设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少 也是至关重要 ...

  7. JavaScript面向对象编程——Array类型

    概述 一维数组 数组是一个有序的数据集合,可以通过数组名称和索引进行访问.JavaScript中并没有明确的数组数据类型. 二维数组 数组是可以嵌套的,这就意味着一个数组可以作为一个袁旭被包含在另一个 ...

  8. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  9. 07 面向对象编程-结构、封装、继承、多态、接口

    文章目录 Struct定义 struct 方法 工厂模式 面向对象三大特性 封装 继承 接口 多态 Golang支持面向对象编程,但是和传统面向对象有区别,并不是纯粹面向对象的语言,只能说Golang ...

最新文章

  1. python输出程序运行时间_Python计算程序运行时间—time.time()、time.clock()
  2. 电子设计基础——电源的各项指标及测量方法
  3. SAP Fiori Service Modeler
  4. Spring框架 AOP面向切面编程(转)
  5. B站美股增长13.24% 收盘价26.34美元创历史最高价
  6. SOPC自定义外设(IP)的地址对齐
  7. 写小说的人是不是都很聪明呢?
  8. centos操作系统版本获取
  9. Python(8)_初学Python
  10. (已解决) centos6.5 yum源 失效 The whole CentOS 6 is dead and shouldn’t be used anywhere at all
  11. 记一次进销存软件的破解(补充)
  12. MiiX私享会 · 第六期: BCH姜家志100分钟深聊BCH硬分叉与算力战!
  13. 使用vue+div+svg实现审批流程图功能,可生成JSON格式
  14. 「干货」从动态的角度分析DDR的时序结构
  15. 安卓miracast花屏_手机投屏电视频繁断开的解决办法
  16. spss分析方法-对应分析(转载)
  17. 2013年各大小IT公司待遇
  18. Reshaper介绍
  19. 设置PHP的环境变量,区分PHP的测试环境和正式环境【php】
  20. HTML,css和JavaScript的基础学习—css篇

热门文章

  1. js / php 网站底部版权文字自动改变年份
  2. C#LeetCode刷题之#342-4的幂(Power of Four)
  3. Java 统计字母个数
  4. phalcon使用registerNamespaces注册第三方类库文件
  5. Python绘图,圣诞树,花,爱心 | Turtle篇
  6. 我帮公司财务写了个“群发工资条”的Python脚本!
  7. 一篇好的技术博文,快速让你通俗理解Python闭包!
  8. 小白学 Python 爬虫:Selenium 获取某大型电商网站商品信息
  9. 协程-greenlet版(python 版)
  10. LeetCode题 - 26 删除排序数组中的重复项 python实现