[Golang] 谈Go中的继承

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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sc_lilei/article/details/83417256

 

继承,这个概念来自于OOP思想。

所谓继承,是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 

继承的关键词:“获得”,“代码复用”。

先来看看典型的OOP语言Python对于继承的实现:

class person:
    def say(self):
        print("person")

class lawyer(person):
    pass

p = person()
l = lawyer()
p.say()
l.say()

显而易见,lawyer这个类在“继承”了person类之后,什么都不用干就自动拥有了say方法。完美体现了“获得”,“代码复用”。

那么Go如何实现继承?看代码:

type person struct {
    Name string
}
func (this person) say(){
	fmt.Printf("i am %s\n", this.Name)
}

//“继承”person
type teacher struct {
    person  //这个叫匿名字段,其实就是个名字,不用在意
}

//我不用又去写一个say方法

func main (){
	p := person{"trump"}
	p.say()
	t := teacher{person:person{"trump's teacher"}}
	t.say()
}

代码是很简单的就不解释了,到这里还没结束。

为什么有这篇文章?因为有人说用go中的接口来实现"继承",是,在interface中也能使用匿名字段,但是这就叫实现了“继承”吗???来看看他们是怎么写的代码:

//先定义一个共用接口,内含一些共用方法
type person_api interface {
	say()
}
//在另一个接口中“继承”上一个接口
type person_2api interface {
	person_api
	run()
}

type lawyer struct {
	Name string
}
func (this lawyer) say(){
	fmt.Printf("i am lawyer %s\n", this.Name)
}

type teacher struct {
	Name string
}
//我仍然要为teacher写一个say方法才能拥有这个方法
func (this teacher) say(){
	fmt.Printf("i am teacher %s\n", this.Name)
}
func (this teacher) run(){
	fmt.Printf("teacher %s is running\n", this.Name)
}


func main (){
	//创建一个接口对象,实现同一个对象的多种形态
	var a1 person_api = lawyer{"sccot"}
	a1.say()
	var a2 person_2api = teacher{"wiliam"}
	a2.say()
	a2.run()
}

这个只是“接口继承”,仅仅是方便interface创建时的字面代码复用,然而在真正使用其方法时,要是不为teacher实现say方法,teacher根本不会拥有这个方法,也就是说仅仅在定义interface时“继承”上一个接口是没有luan用的,没有办法通过“接口继承”的方式真正获得另一个结构体拥有的方法。所谓“接口继承”,其实与OOP思想提到的“继承”没有一丝关系。

本文作为个人学习的归纳总结,不能保证毫无瑕疵。如果您对我的文章有任何异议,请您留言。


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

本文来自:CSDN博客

感谢作者:sc_lilei

查看原文:[Golang] 谈Go中的继承

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

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