分享
  1. 首页
  2. 文章

【玩转Golang】 通过组合嵌入实现代码共用

dajianshi · · 3745 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

如果在以往的支持类继承的语言中,比如c++,Java,c#等,这很简单!可是go不支持继承,只能mixin嵌入,且看下面的代码:

type ManKind interface{
 Say(s string); 
 GetMouth()string
}
type Man struct{
 ManKind 
}
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 main
import(
 "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属性。


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:dajianshi

查看原文:【玩转Golang】 通过组合嵌入实现代码共用

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
3745 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏