[Golang] 谈Go中的继承

继承,这个概念来自于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思想提到的“继承”没有一丝关系。

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

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值