【玩转Golang】 通过组合嵌入实现代码复用
应用开发中的一个常见情景,为了避免简单重复,需要在基类中实现共用代码,着同样有助于后期维护。
如果在以往的支持类继承的语言中,比如c++,Java,c#等,这很简单!可是go不支持继承,只能mixin嵌入,且看下面的代码:
type ManKind interface{Say(s string); GetMouth()string } type Man struct{} func NewMan() ManKind{return &Man{}; } func (this *Man)GetMouth()string{return "M0" } func (this *Man) Say(s string){fmt.Printf("\n Speak with mouth[%s] : \"%s\"",this.GetMouth(),s); } type StrongMan struct{Man } func NewStrongMan()ManKind{return &StrongMan{} } func (this*StrongMan)GetMouth()string{return "M1" } func main(){ NewMan().Say("good luck!")NewStrongMan().Say("good luck!") }
如果支持继承,很明显应该输出
Speak with mouth[M0] : "good luck!"Speak with mouth[M1] : "good luck!"
但是在golang中只能输出:
Speak with mouth[M0] : "good luck!"Speak with mouth[M0] : "good luck!"
StrongMan中调用Say(),此时可以将指针传递到内嵌类,只是简单的指向了Man的方法,在ManKind中调用GetMouth就是ManKind自己的GetMouth,和StrongMan没有关系。
当然,我们可以在StrongMan中覆盖Say方法
func (this *StrongMan)Say(s string){fmt.Printf("\n Speak with mouth[%s] : \"%s\"",this.GetMouth(),s); }
此时,当然可以正确输出,因为本来调用的就都是StrongMan自己的方法了,这又和我们的初衷相违背了。那么这种情况怎么实现呢?我的方法是,让Man再脏一点儿,把需要的东西传递给组合进来的类。
给Man增加一个属性mouth,增加一个SetMouth方法,修改一下GetMouth方法,StrongMan的GetMouth方法删除掉,再修改一下NewStrongMan方法,最后的代码如下:
package mainimport("fmt" )type ManKind interface{Say(s string); SetMouth(m string)GetMouth()string } type Man struct{ManKind mouth string } func NewMan() ManKind{return &Man{mouth:"M0"}; } func (this *Man)GetMouth()string{return this.mouth; } func (this *Man)SetMouth(s string){this.mouth=s; } func (this *Man) Say(s string){fmt.Printf("\n Speak with mouth[%s] : \"%s\"",this.GetMouth(),s); } type StrongMan struct{Man } func NewStrongMan()ManKind{sm := &StrongMan{} sm.SetMouth("M1"); return sm; }func main(){ NewMan().Say("good luck!")&NewStrongMan().Say("good luck!") }
当然,如果你不愿意用Get、Set方法,也可以直接输出Man的Mouth属性。
我总结的嵌入式编程要点:
1,被嵌入的类的方法,只能访问他自己的字段,包装类即时声明了同名字段也没用。
2,包装类可以覆盖嵌入类的方法,但是嵌入类访问不到,亦然访问自己的方法。只能在包装类中连同调用方法一同实现。
3,包装类覆盖嵌入类字段后,亦然可以通过嵌入类的类名访问嵌入类的字段。
【玩转Golang】 通过组合嵌入实现代码复用相关推荐
- 《On Java 8》- 面向对象之代码复用(组合、继承、委托)
文章目录 小结 原文 组合语法 继承语法 委托 结合组合与继承 组合与继承的选择 小结 根据<On Java 8>: 第八章复用 总结 复用指的是代码复用,一般情况下有两种方式:组合.继承 ...
- Go_vscode玩转golang
title: Go_vscode玩转golang categories: Go tags: [go, vscode, 编译, 调试] date: 2018-08-03 02:16:18 comment ...
- 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...
- html中看到php代码_如何在HTML中嵌入PHP代码
如何在HTML中嵌入PHP代码 对于一个有经验的 PHP Web 开发者,在HTML中嵌入PHP代码是一件非常容易的事情.但是对于刚开始接触 PHP 编程语言的新手这就是一个问题.下面是小编为大家带来 ...
- golang匿名组合
匿名组合 匿名字段 一般情况下,定义结构体的时候是字段名和其类型一一对应,实际上go支持只提供类型而不写字段名的方法,也就是匿名字段,也称为嵌入式字段 当匿名字段也是一个结构体的时候,那么这个结构体所 ...
- 在HTML中嵌入PHP代码,有以下几种方法,其中错误的是( )
在HTML中嵌入PHP代码,有以下几种方法,其中错误的是( D) A.以"<?php开头,以"?>"结束,中间为PHP代码. B.以<script la ...
- JSP中嵌入java代码方式以及指令
JSP中嵌入java代码的三种方式: (1)声明变量或方法 : <%! 声明; %> :慎重使用,因为此方法定义的是全局变量 (2)java片段(scriptlet): <% j ...
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 姓名:李冬辉 学号:20133201 注: 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http ...
- python中组合数据类型、函数和代码复用的难点_Python电子教案5-2 函数和代码复用...
<Python电子教案5-2 函数和代码复用>由会员分享,可在线阅读,更多相关<Python电子教案5-2 函数和代码复用(56页珍藏版)>请在人人文库网上搜索. 1.七段数码 ...
最新文章
- JavaScript [ 转 ] —— 面向对象编程(三):非构造函数的继承
- react native 之自定义顶部导航栏,实现标题居中可控
- JQuery链式操作简单的菜单列表
- 利用JQuery插件CleverTabs实现多页签打开效果
- tomcat6配置log4j日志
- python继承方式是基于原型吗_[译] 为什么原型继承很重要
- 超实用PHP函数总结整理
- Vue-watch侦听器和计算属性
- directx sdk march 2009_小视科技极致轻量级模型人脸识别sdk支持活体检测总模型仅8M...
- Java基础篇:简单数据类型
- Java基础93 JDBC连接MySQL数据库
- 汉字一、二级字库的汉字与unicode编码(十六进制)对照表,按照unicode的顺序排列
- 什么是对称加密(对称加密简介)
- 最新运营级WiFi大师专业版源码
- 华为路由器交换机常用命令(随时补充更新)
- Electron 去掉标题栏并设定可拖动
- appstore 屏幕快照_Windows 8屏幕快照之旅:您可能想知道的一切
- UML建模基础知识点
- 前端工程师第一篇-HTML(1)
- [转]如何解决Windows图片预览窗口无法显示图片缩略图
热门文章
- LeetCode Guess Number Higher or Lower II(动态规划)
- LeetCode House Robber III(动态规划)
- 题目1027:欧拉回路
- Elasticsearch深入11 运维
- 博客基础_django_python从入门到实践_创建项目_创建应用
- 【OpenCV学习笔记之一】图像加载,修改及保存
- [JSOI2007]合金
- springboot多数据源动态切换和自定义mybatis分页插件
- php数据库访问辅助类,php+MySQL实战案例【二】php数据库辅助类
- python无法导入pyaudio_python – pyaudio无法导入_portaudio