zoukankan      html  css  js  c++  java
  • golang的继承

    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
    showB
    	t.People.ShowA() //showA
    showB
    	t.ShowB()        //teacher showB
    	t.People.ShowB() //showB
    }
    

      

    解释输出结果:

    t.ShowA() 输出:showA showB。 调用showA时,因为Teacher没有ShowA()的方法,此时又匿名继承了People,所以会调到People实现的ShowA方法去

    t.People.ShowA() 输出:showA showB。 匿名继承时指定调用的结构体方法,这时候一定会调用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
    showB
    	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 showB 。有名继承,People是P的类型,此时调用People的ShowA方法
    t.P.ShowB() //showB 同上

    未完待续。。。

  • 相关阅读:
    linux c编程:Posix消息队列
    go语言之接口二
    linux c编程:FIFO
    python cookbook第三版学习笔记十九:未包装的函数添加参数
    linux c编程:popen
    linux c编程:管道
    Linux c编程:I/O多路复用之epoll
    Linux c编程:I/O多路复用之select
    inux c编程:记录锁
    python cookbook第三版学习笔记十八:可由用户修改的装饰器
  • 原文地址:https://www.cnblogs.com/wuyepeng/p/15047007.html
Copyright © 2011-2022 走看看