应用开发中的一个常见情景,为了避免简单重复,需要在基类中实现共用代码,着同样有助于后期维护。

如果在以往的支持类继承的语言中,比如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】 通过组合嵌入实现代码复用相关推荐

  1. 《On Java 8》- 面向对象之代码复用(组合、继承、委托)

    文章目录 小结 原文 组合语法 继承语法 委托 结合组合与继承 组合与继承的选择 小结 根据<On Java 8>: 第八章复用 总结 复用指的是代码复用,一般情况下有两种方式:组合.继承 ...

  2. Go_vscode玩转golang

    title: Go_vscode玩转golang categories: Go tags: [go, vscode, 编译, 调试] date: 2018-08-03 02:16:18 comment ...

  3. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

  4. html中看到php代码_如何在HTML中嵌入PHP代码

    如何在HTML中嵌入PHP代码 对于一个有经验的 PHP Web 开发者,在HTML中嵌入PHP代码是一件非常容易的事情.但是对于刚开始接触 PHP 编程语言的新手这就是一个问题.下面是小编为大家带来 ...

  5. golang匿名组合

    匿名组合 匿名字段 一般情况下,定义结构体的时候是字段名和其类型一一对应,实际上go支持只提供类型而不写字段名的方法,也就是匿名字段,也称为嵌入式字段 当匿名字段也是一个结构体的时候,那么这个结构体所 ...

  6. 在HTML中嵌入PHP代码,有以下几种方法,其中错误的是( )

    在HTML中嵌入PHP代码,有以下几种方法,其中错误的是( D) A.以"<?php开头,以"?>"结束,中间为PHP代码. B.以<script la ...

  7. JSP中嵌入java代码方式以及指令

    JSP中嵌入java代码的三种方式: (1)声明变量或方法 :  <%! 声明; %> :慎重使用,因为此方法定义的是全局变量 (2)java片段(scriptlet):  <% j ...

  8. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 姓名:李冬辉 学号:20133201 注: 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http ...

  9. python中组合数据类型、函数和代码复用的难点_Python电子教案5-2 函数和代码复用...

    <Python电子教案5-2 函数和代码复用>由会员分享,可在线阅读,更多相关<Python电子教案5-2 函数和代码复用(56页珍藏版)>请在人人文库网上搜索. 1.七段数码 ...

最新文章

  1. JavaScript [ 转 ] —— 面向对象编程(三):非构造函数的继承
  2. react native 之自定义顶部导航栏,实现标题居中可控
  3. JQuery链式操作简单的菜单列表
  4. 利用JQuery插件CleverTabs实现多页签打开效果
  5. tomcat6配置log4j日志
  6. python继承方式是基于原型吗_[译] 为什么原型继承很重要
  7. 超实用PHP函数总结整理
  8. Vue-watch侦听器和计算属性
  9. directx sdk march 2009_小视科技极致轻量级模型人脸识别sdk支持活体检测总模型仅8M...
  10. Java基础篇:简单数据类型
  11. Java基础93 JDBC连接MySQL数据库
  12. 汉字一、二级字库的汉字与unicode编码(十六进制)对照表,按照unicode的顺序排列
  13. 什么是对称加密(对称加密简介)
  14. 最新运营级WiFi大师专业版源码
  15. 华为路由器交换机常用命令(随时补充更新)
  16. Electron 去掉标题栏并设定可拖动
  17. appstore 屏幕快照_Windows 8屏幕快照之旅:您可能想知道的一切
  18. UML建模基础知识点
  19. 前端工程师第一篇-HTML(1)
  20. [转]如何解决Windows图片预览窗口无法显示图片缩略图

热门文章

  1. LeetCode Guess Number Higher or Lower II(动态规划)
  2. LeetCode House Robber III(动态规划)
  3. 题目1027:欧拉回路
  4. Elasticsearch深入11 运维
  5. 博客基础_django_python从入门到实践_创建项目_创建应用
  6. 【OpenCV学习笔记之一】图像加载,修改及保存
  7. [JSOI2007]合金
  8. springboot多数据源动态切换和自定义mybatis分页插件
  9. php数据库访问辅助类,php+MySQL实战案例【二】php数据库辅助类
  10. python无法导入pyaudio_python – pyaudio无法导入_portaudio