golang是可以实现继承的,但是这种继承并不是严格意义上的继承,golang并不⽀持继承特性,因⽽也没有单继承,多继承,重写⽅法等复杂概念。
下⾯通过⼀些例⼦来讲解golang的继承组合继承(1)匿名继承
type People struct{}func (p *People) ShowA() { fmt.Println(\"showA\") p.ShowB()}
func (p *People) ShowB() { fmt.Println(\"showB\")}
type Teacher struct { People}
func (t *Teacher) ShowB() { fmt.Println(\"teacher showB\")}
func main() { t := Teacher{}
t.ShowA() //showA\\nshowB t.People.ShowA() //showA\\nshowB t.ShowB() //teacher showB t.People.ShowB() //showB}
解释输出结果:
t.ShowA() 输出:showA\\nshowB。 调⽤showA时,因为Teacher没有ShowA()的⽅法,此时⼜匿名继承了People,所以会调到People实现的ShowA⽅法去
t.People.ShowA() 输出:showA\\nshowB。 匿名继承时指定调⽤的结构体⽅法,这时候⼀定会调⽤People上的ShowA⽅法,如果People没有该⽅法会编译报错
t.ShowB() 输出:eacher showB。 因为Teacher本⾝有实现ShowB⽅法,所以会调⽤到 Teacher的ShowB⽅法。t.People.ShowB() 输出:showB。 此时如果我们想调⽤People的ShowB⽅法只能时通过指定结构体的⽅法。(2)有名继承
type People struct{}func (p *People) ShowA() { fmt.Println(\"showA\") p.ShowB()}
func (p *People) ShowB() { fmt.Println(\"showB\")}
type Teacher struct { P People}
func (t *Teacher) ShowB() { fmt.Println(\"teacher showB\")}
func main() { t := Teacher{}
t.ShowA() //报错 t.People.ShowA() //报错 t.People.ShowB() //报错 t.ShowA() // 报错
t.ShowB() //teacher showB t.P.ShowA() //showA\\nshowB t.P.ShowB() //showB}
输出结果解释:
t.ShowA() 结果:报错。 Teacher没有ShowA的⽅法,虽然People有,但是此时People不是匿名继承 ,如果要要调⽤需要指定继承事指定的名称。
t.People.ShowA() 结果:报错。 t⾥没有这个对象,此时People在结构体的名称为P,⽽不是People,此时的People是P的类型t.People.ShowB() 结果:报错。 同时上
t.ShowB() 结果:teacher showB。 调⽤teacher的ShowB⽅法
t.P.ShowA() 结果:showA\\nshowB 。有名继承,People是P的类型,此时调⽤People的ShowA⽅法t.P.ShowB() //showB 同上
未完待续。。。
因篇幅问题不能全部显示,请点此查看更多更全内容