继承,这个概念来自于OOP思想。
所谓继承,是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
继承的关键词:“获得”,“代码复用”。
先来看看典型的OOP语言Python对于继承的实现:
class person:def say(self):print("person")class lawyer(person):passp = 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_apirun()
}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思想提到的“继承”没有一丝关系。
本文作为个人学习的归纳总结,不能保证毫无瑕疵。如果您对我的文章有任何异议,请您留言。