继承,这个概念来自于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思想提到的“继承”没有一丝关系。
本文作为个人学习的归纳总结,不能保证毫无瑕疵。如果您对我的文章有任何异议,请您留言。
有疑问加站长微信联系(非本文作者)