在Golang中实现多态
1、说明
和流行的面向对象语言不同,go 中没有面向对象的说法,也没有对应的封装、继承和多态,也许 go 的设计就不是和OOP对齐,想使用OOP,那就去用 Java 或者 C++ 吧。
但是,没有不表示 go 不能,我们仍然可以拐着弯地去使用
比如封装,可以用结构体模拟;继承可以使用接口和嵌套结构体,多态有些麻烦,前两者结合也可以实现
2、多态
程序设计中有一种风格鸭式辩型,javascript 里面常用,大概意思就是,走路像鸭子,叫起来像鸭子,那么它就是一只鸭子
把它放到 go 中,尽管没有多态,但是能实现多态相同的用法,那它就是多态
3、代码示例
我们用手机举例子,现在有多款手机,都能打电话(call()),但是打电话的内容不同,我们要能实现动态地切换不同手机打电话
放在 C++/java 中,这个功能很容易实现,只需要创建一个基类 Phone,然后不同手机的子类继承 Phone,实现 call() 方法即可,go 中,使用以下方式实现
示例:
type PhoneData struct {
name string
}
type Phone interface {
call()
}
Phone 定义接口,后面需要实现这个接口,PhoneData 则表示各个手机都有的属性(这里是name)
type IPhone struct {
PhoneData
}
func (phone *IPhone) call() {
fmt.Printf("%s call\n", phone.name)
}
定义 IPhone,实现 call() 方法
type HWPhone struct {
PhoneData
}
func (phone *HWPhone) call() {
fmt.Printf("%s call", phone.name)
}
定义 HWPhone,实现 call() 方法
func getPhone(name string) Phone {
switch name {
case "iphone":
phone := new(IPhone)
phone.name = "iphone"
return phone
case "hwphone":
phone := new(HWPhone)
phone.name = "hwphone"
return phone
default:
fmt.Println("no phone")
}
return nil
}
对象工厂,根据参数,获取不同的手机
func main() {
var phone Phone
phone = getPhone("hwphone")//输出hwphone call
phone.call()
}
调用处,这里的的 phone 变量执行的 call() 方法,可以能是 IPhone,也可能是 HWPhone 的
4、总结
每种语言都有它的优势和劣势,go 可能设计之初就不是基于 OOP,强行按照 OOP 的思路写 go 到底是正途还是歪门邪道,我也不知道。写惯了 OOP 的人,即使换一种语言总喜欢用 OOP 的思路去套用,果然,思维的转换才是最难的
还是需要学习啊!!!
在Golang中实现多态的更多相关文章
- Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现
前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...
- 七、golang中接口、反射
一.接口定义 1.定义 interface类型可以定义一组方法,但是这些不需要实现,并且interface不能包含任何变量 package main import ( "fmt" ...
- Golang | Go语言多态的实现与interface使用
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第11篇文章,我们一起来聊聊golang当中多态的这个话题. 如果大家系统的学过C++.Java等语言以及面向对象的 ...
- 13、java中的多态
1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...
- golang中的race检测
golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...
- 基础知识 - Golang 中的正则表达式
------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...
- java中实现多态的机制是什么?
多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...
- C#中区别多态、重载、重写的概念和语法结构
C#中区别多态.重载.重写的概念和语法结构 重写是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override. 格式: 基类中: public virtual ...
- 转载:C#中的多态
原文地址 http://www.cnblogs.com/jhxk/articles/1644018.html 感谢博主分享! 之前看到过类似的问题:如果面试时主考官要求你用一句话来描述多态,尽可能的 ...
- golang中的reflect包用法
最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生 ...
随机推荐
- Windows下如何查看某个端口被占用,以及如何杀死某个进程
查看所有端口 netstat -ano 如何查看某个特定端口的占用情况,比如 8080 netstat -ano|findstr "8080" 杀死一个进程 在查看某个端口被占用的 ...
- Codeforces Round #739 (Div. 3) 个人题解(A~F2)
比赛链接:Here 1560A. Dislike of Threes Description 找出第 $k$ 大的不可被 $3$ 整除以及非 $3$ 结尾的整数 直接枚举出前 1000 个符合条件的数 ...
- Codeforce 515C. Drazil and Factorial(字符串思维题)
[CodeForces]C. Drazil and Factorial 题目链接:Click Here 题意:找一个最大的数,使得每个位的阶乘的乘积与给定数相同. 首先將 2~9 轉成這樣(0,1為空 ...
- 版本升级 | 兼容VSCode及全系IDE,代码风险一键查询
OpenSCA插件上新啦~ Jetbrains IDE插件全新升级,很多朋友提了需求的VSCode咱也支持上啦~ 当然,CEC-IDE也是兼容的(手动狗头). OpenSCA-VSCode-plugi ...
- python生成word文档
python生成word文档,感觉比java生成方便很多 下面看看步骤 1.环境 pip install python-docx 2.准备一张需要插入word中的图片monty-truth.png 3 ...
- java进阶(14)--日期时间处理
一.获取系统当前时间: 1.Date(),精确到毫秒的当前当前时间 2.示例,欧美风格时间格式
- 以太网链路连接 和 ISIS/OSPF等路由协议关系
转载请注明出处: 以太网链路连接和ISIS/OSPF协议之间存在关联和区别 关联: 以太网链路连接是指通过以太网物理媒介(如电缆)将网络设备进行连接,使它们可以交换数据. ISIS(Intermedi ...
- spring boot 集成配置阿里 Druid监控配置
本文为博主原创,转载请注明出处: github 地址如下:https://github.com/alibaba/druid/wiki 其相关问题也可参考:https://github.com/alib ...
- [转帖]ls 只显示目录
https://www.cnblogs.com/lavin/p/5912369.html 只显示目录: ls -d */ 在实际应用中,我们有时需要仅列出目录,下面是 4 种不同的方法. 1. 利用 ...
- [转帖]TiKV & TiFlash 加速复杂业务查询
https://tidb.net/book/tidb-monthly/2022/2022-07/usercase/tikv-tiflash 背景 在互联网公司或传统公司的 CRM 系统中,最常用的功 ...